【问题标题】:Swift: Cannot assign value '(Bool, MCSession) -> Void' to type '(Bool, MCSession!) -> Void!'Swift:无法将值“(Bool,MCSession)-> Void”分配给类型“(Bool,MCSession!)-> Void!”
【发布时间】:2015-11-03 21:09:44
【问题描述】:

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

我试图修复它,所以我将 func 广告商的标题更改为这个:

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

然后它给我一个错误

无法分配值 '(Bool, MCSession) -> Void' 来键入 '(Bool, MCSession!)-> 无效!'

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

实际文件:

    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) { }

    }

【问题讨论】:

  • 能否将问题代码的sn-ps放入您的问题中?
  • 已编辑!现在呢?
  • 你能解决这个问题吗?

标签: swift bluetooth


【解决方案1】:

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

要修复它,请使用带有 invitationHandler 变量的参数匹配类型定义您的 advertiser 方法。

【讨论】:

  • 如果我这样做,我会再次显示第一个错误,MPCManager 不符合协议 MCNearbyServiceAdvertizerDelegate
  • 我明白了。所以,你必须改变invitationHandler的类型匹配advertiser方法中的定义。
  • 试过了,然后它抛出一个错误initialized handler必须在init func中初始化,我如何初始化这样的var?
  • 试试这个var invitationHandler:((Bool, MCSession)-&gt;Void)?
【解决方案2】:

MPCManager的属性invitationHandler定义为:

var invitationHandler: (Bool, MCSession!) -> Void!

...而advertiser方法的参数invitationHandler定义为

invitationHandler: (Bool, MCSession) -> Void

这里有2个不匹配:

  • 属性的返回值为Void!,而参数返回Void
  • 属性的第二个参数是MCSession!,而方法采用MCSession

首先,我没有看到将Void! 作为返回值的意义。 Void 表示根本没有返回任何内容,因此无需隐式解包。

其次,参数的类型必须匹配。所以,要么两者都应该是MCSession,要么都应该是MCSession!

例如以下不会产生您提到的错误:

var invitationHandler: (Bool, MCSession!) -> Void

// ...

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

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多