首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:无法赋值'(Bool,MCSession) -> Void‘to type '(Bool,MCSession!) -> Void!

Swift:无法赋值'(Bool,MCSession) -> Void‘to type '(Bool,MCSession!) -> Void!
EN

Stack Overflow用户
提问于 2015-11-03 21:09:44
回答 2查看 686关注 0票数 1

我正在尝试本教程,因为新的快速版本出现了一些错误,其中一个错误是MPCManager不符合MCNearbyServiceAdvertiserDelegate协议。

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

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

但它却让我犯了个错误

无法赋值'(Bool,MCSession) -> Void‘to type '(Bool,MCSession!) -> Void!“

我不知道如何修复,帮助欣赏!

实际档案:

代码语言:javascript
复制
    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) { }

    }
EN

回答 2

Stack Overflow用户

发布于 2015-11-04 01:58:02

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-11-04 06:52:28

invitationHandler的属性MPCManager定义为:

代码语言:javascript
复制
var invitationHandler: (Bool, MCSession!) -> Void!

..。而参数invitationHandler of advertiser方法定义为

代码语言:javascript
复制
invitationHandler: (Bool, MCSession) -> Void

这里有两处不匹配:

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

首先,我不认为将Void!作为返回值的意义。Void意味着什么都不返回,所以不需要隐式地展开它。

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

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

代码语言:javascript
复制
var invitationHandler: (Bool, MCSession!) -> Void

// ...

func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, 
    invitationHandler: (Bool, MCSession!) -> Void) {
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33509118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档