【Swift 5】手機也能變撲克牌魔術?

這篇應該算是『極短篇』吧,個人其實是滿喜歡魔術的(喜歡被騙?),最近在Youtube上看到一篇牌穿進手機的魔術揭秘,看起來是很久以前的魔術了(把妹招術?),身為魔術師(脫魯?)的我,當然也要來練習一下,不過它這篇手機上的牌是固定的,而個人在這裡做一些改良,主要是利用ProximityMonitor的變化,跟Firebase的RealtimeDatabase來變魔術,讓我們來看看吧。

準備道具

  • iPhone手機一支
  • 可連上Firebase Console的手機一支
  • 未使用過的撲克牌一付
  • 想要認識的對象 (心儀的對象?)
  • 你的好朋友們 (幫忙作弊?)

事前準備工作

撲克牌的檔案命名

Firebase

  • 資料庫長相如下,主要是要取得『Poker』上的值,就是在專案裡面的撲克牌圖片名稱,Firebase的使用方式就不再多說了

程式

取得Firebase資料庫的值
//  FIRDatabase.swift
import UIKit
import Firebase

class FIRDatabase: NSObject {
    
    public static let shared = FIRDatabase()
    private let database = Database.database().reference()
    
    private override init() { super.init() }
    
    /// 取得所有數據
    func allValues(result: @escaping ([String : Any]?) -> Void) {
        
        database.observeSingleEvent(of: .value, with: { (snapshot) in
            guard let userDict = snapshot.value as? [String: Any] else { result(nil); return }
            result(userDict)
        }, withCancel: nil)
    }
}
讀取Proximity的變化
//  ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet var pokerImageView: UIImageView!
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        pokerImageView.isHidden = true
        
        UIDevice.current.isProximityMonitoringEnabled = true
        NotificationCenter.default.addObserver(self, selector: #selector(show(notification:)), name: UIDevice.proximityStateDidChangeNotification, object: nil)
    }

    private func showPokerImage(_ image: UIImage?) {
        pokerImageView.image = image ?? #imageLiteral(resourceName: "JokerRed")
        pokerImageView.isHidden = false
    }
    
    @objc private func show(notification: NSNotification) {
        
        let database = FIRDatabase.shared
        let Key = "Poker"
        
        database.allValues(result: { (array) in
            
            if let pokerArray = array as? [String: String] {
                if let imagename = pokerArray[Key] {
                    self.showPokerImage(UIImage.init(named: imagename))
                }
            }
        })
    }
}

表演過程

  • 首先將未使用過的撲克牌給對方看,證明牌都是正常的
  • 開始洗牌,然後讓對方抽一張,表演者背對大家,然後讓在場的人看這張抽到的牌是什麼牌
  • 接下來就是考驗友情的時刻到了,叫你的好友趕快用手機改firebase資料庫
  • 然後表演者就將手機放在桌上,口中說說咒語,見證奇蹟的時刻到了,把手劃過手機的ProximityMonitor,對方抽到的牌就出現在手機上了喲

影片

範例程式碼下載