Swift:无法将值 '(Bool, MCSession) -> Void' 分配给类型 '(Bool, MCSession!) -> Void!'

标签 swift bluetooth

我正在尝试 this tutorial由于新的 swift 版本出现了一些错误,其中之一是 MPCManager 不符合协议(protocol) MCNearbyServiceAdvertiserDelegate。

我试图修复它,所以我将 func advertiser 的 header 更改为这个:

func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession)->Void) {

然后它抛出一个错误

Cannot assign value '(Bool, MCSession) -> Void' to type '(Bool, MCSession!) -> Void!'

我不知道如何解决,感谢帮助!

实际文件:

    import UIKit
    import MultipeerConnectivity

    protocol MPCManagerDelegate {
        func foundPeer()

        func lostPeer()

        func invitationWasReceived(fromPeer: String)

        func connectedWithPeer(peerID: MCPeerID)
    }

    class MPCManager: NSObject, MCSessionDelegate, MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate {
        var session: MCSession!
        var peer: MCPeerID!
        var browser: MCNearbyServiceBrowser!
        var advertiser: MCNearbyServiceAdvertiser!

        var foundPeers = [MCPeerID]()
        var invitationHandler: (Bool, MCSession!)->Void!
        var delegate: MPCManagerDelegate?

        override init() {
            super.init()

            invitationHandler(false, nil)

            peer = MCPeerID(displayName: UIDevice.currentDevice().name)

            session = MCSession(peer: peer)
            session.delegate = self

            browser = MCNearbyServiceBrowser(peer: peer, serviceType: "appcoda-mpc")
            browser.delegate = self

            advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: nil, serviceType: "appcoda-mpc")
            advertiser.delegate = self
        }

        func browser(browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
            foundPeers.append(peerID)

            delegate?.foundPeer()
        }

        func browser(browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
            for (index, aPeer) in EnumerateSequence(foundPeers){
                if aPeer == peerID {
                    foundPeers.removeAtIndex(index)
                    break
                }
            }

            delegate?.lostPeer()
        }

        func browser(browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: NSError) {
            print(error.localizedDescription)
        }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE Error occurs here: ~~~~~~~~~~~~~~~~~~~~~~
        func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession)->Void) {
            self.invitationHandler = invitationHandler

            delegate?.invitationWasReceived(peerID.displayName)
        }

        func advertiser(advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: NSError) {
            print(error.localizedDescription)
        }



        func session(session: MCSession, peer peerID: MCPeerID, didChangeState state: MCSessionState) {
            switch state{
            case MCSessionState.Connected:
                print("Connected to session: \(session)")
                delegate?.connectedWithPeer(peerID)

            case MCSessionState.Connecting:
                print("Connecting to session: \(session)")

            default:
                print("Did not connect to session: \(session)")
            }
        }

        func sendData(dictionaryWithData dictionary: Dictionary<String, String>, toPeer targetPeer: MCPeerID) -> Bool {
            let dataToSend = NSKeyedArchiver.archivedDataWithRootObject(dictionary)
            let peersArray = NSArray(object: targetPeer) as! [MCPeerID]

            do {
                _ = try session.sendData(dataToSend, toPeers: peersArray, withMode: MCSessionSendDataMode.Reliable)
            } catch let error as NSError {
                print(error.localizedDescription)
                return false
            }

            return true
        }

        func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) {
            let dictionary: [String: AnyObject] = ["data": data, "fromPeer": peerID]
            NSNotificationCenter.defaultCenter().postNotificationName("receivedMPCDataNotification", object: dictionary)
        }

        func session(session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, withProgress progress: NSProgress) { }

        func session(session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, atURL localURL: NSURL, withError error: NSError?) { }

        func session(session: MCSession, didReceiveStream stream: NSInputStream, withName streamName: String, fromPeer peerID: MCPeerID) { }

    }

最佳答案

您使用 (Bool, MCSession!)->Void! 类型定义了 invitationHandler 变量,然后为其赋值 (Bool, MCSession)->Void) 类型。这就是导致您的错误消息的原因。

要解决此问题,请使用带有 invitationHandler 变量的参数匹配类型定义您的 advertiser 方法。

关于Swift:无法将值 '(Bool, MCSession) -> Void' 分配给类型 '(Bool, MCSession!) -> Void!',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509118/

相关文章:

swift - 意外地发现 nil 意外 - struct init?不工作

ios - AFNetworking 2.0 向服务器发送参数和图像

bluetooth - 为什么 BluetoothLEAdvertisementWatcher 停止触发 `Received` 事件?

ios - 核心蓝牙 : CBPeripheral disconnects every ~10 seconds

android - 如何使用android蓝牙接收串行数据

ios - 'NSError' 不可转换为 'UInt8'

当数组更改时,SwiftUI ForEach 不会迭代。列表为空且 ForEach 确实运行

linux - 串行蓝牙 (SPP) 配置和设置

swift - 将 UIButtons 添加到折线图中的数据点,在 X 轴上绘制日期和时间

安卓蓝牙 : get Device Specific AT commands