Swift 类型';MPCManager';不符合协议';MCNearbyServiceAdvertiserDelegate';

Swift 类型';MPCManager';不符合协议';MCNearbyServiceAdvertiserDelegate';,swift,Swift,在我的swift 2应用程序中,我遇到两个错误: 协议需要功能 '广告商(u:didReceiveInvitationFromPeer:with context:invitationHandler:)' 使用“MCNearbyServiceAdvertiser”类型,收到来自同行的邀请: McGerid,withContext:NSData?,邀请处理程序:(Bool,MCSession) ->Void)->Void' 及 候选项具有不匹配的类型“”(MCNearbyServiceAdverti

在我的swift 2应用程序中,我遇到两个错误:

协议需要功能 '广告商(u:didReceiveInvitationFromPeer:with context:invitationHandler:)' 使用“MCNearbyServiceAdvertiser”类型,收到来自同行的邀请: McGerid,withContext:NSData?,邀请处理程序:(Bool,MCSession) ->Void)->Void'

候选项具有不匹配的类型“”(MCNearbyServiceAdvertiser, 是否收到来自对等方的邀请:mcpercid,上下文:NSData?, 邀请处理程序:(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)
    }


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

}
导入UIKit
导入多点连接
协议MPCManagerDelegate{
func foundPeer()
func lostPeer()
收到func邀请(来自同行:字符串)
func与对等方连接(peerID:mcpeerind)
}
类MPCManager:NSObject、MCSessionDelegate、MCNearbyServiceBrowserDelegate、MCNearbyServiceAdvertiserDelegate{
var会话:MCSession!
var peer:McGerid!
var浏览器:MCNearbyServiceBrowser!
var广告商:MCNearbyServiceAdvertiser!
var foundPeers=[mcpercid]()
var invitationHandler:(Bool,MCSession!)->Void
var代表:MPCManagerDelegate?
重写init(){
super.init()
邀请处理程序(false,nil)
peer=mcpercid(显示名称:UIDevice.currentDevice().name)
会话=MCSession(对等:对等)
session.delegate=self
browser=MCNearbyServiceBrowser(对等:对等,服务类型:“appcoda mpc”)
browser.delegate=self
广告商=MCNearbyServiceAdvertiser(对等方:对等方,发现信息:无,服务类型:“appcoda mpc”)
advertiser.delegate=self
}
func浏览器(浏览器:MCNearbyServiceBrowser,foundPeer-peerID:MCPeerID,带有discoveryinfo-info:[String:String]?){
foundPeers.append(peerID)
委托人?.foundPeer()
}
func浏览器(浏览器:McNearByService浏览器,lostPeer peerID:MCPeerID){
用于枚举序列(foundPeers)中的(索引,aPeer){
如果aPeer==peerID{
foundPeers.removeAtIndex(索引)
打破
}
}
委托人?.lostPeer()
}
func浏览器(浏览器:MCNearbyServiceBrowser,未启动同行浏览错误:N错误){
打印(错误。本地化描述)
}
func广告商(广告商:MCNearbyServiceAdvertiser,DidReceiveInvitationfromPeerId:McGerid,上下文:NSData?,邀请处理程序:(Bool,MCSession!)->Void){
self.invitationHandler=invitationHandler
代表?已收到邀请(peerID.displayName)
}
func广告客户(广告客户:MCNearbyServiceAdvertiser,未启动转发对等错误:N错误){
打印(错误。本地化描述)
}
func会话(会话:MCSession,对等对等peerID:MCPeerID,didChangeState:MCSessionState){
开关状态{
案例MCSessionState。已连接:
打印(“连接到会话:\(会话)”)
代理?.connectedWithPeer(peerID)
案例MCSessionState。正在连接:
打印(“连接到会话:\(会话)”)
违约:
打印(“未连接到会话:\(会话)”)
}
}
func sendData(dictionaryWithData字典:dictionary,toPeer targetPeer:mcpeerind)->Bool{
让dataToSend=NSKeyedArchiver.archivedDataWithRootObject(字典)
让peersArray=NSArray(对象:targetPeer)作为![mcpercid]
做{
尝试session.sendData(dataToSend,toPeers:peersArray,withMode:MCSessionSendDataMode.Reliable)
}将let错误捕获为NSError{
打印(错误。本地化描述)
返回错误
}
返回真值
}
func会话(会话:MCSession,didReceiveData数据:NSData,来自对等对等peerID:mcpeerind){
let dictionary:[String:AnyObject]=[“data”:data,“fromPeer”:peerID]
NSNotificationCenter.defaultCenter().postNotificationName(“receivedMPCDataNotification”,对象:字典)
}
func session(session:MCSession,didStartReceivingResourceWithName resourceName:String,fromPeer peerID:mcPeerind,withProgress:NSProgress){}
func会话(会话:MCSession,didFinishReceivingResourceWithName resourceName:String,fromPeer peerID:MCPeerID,atURL localURL:NSURL,withError错误:NSError?{}
func session(session:MCSession,didReceiveStream:NSInputStream,with name streamName:String,fromPeer peerID:mcpeirid){}
}

回调参数
invitationHandler:(Bool,MCSession!)->Void
有一个参数未包装。删除感叹号
MCSession之后的数据类型。这使得方法与原始委托方法不匹配,Swift无法找到此协议的必需的委托方法

已更新

回调的更改声明

var invitationHandler: (Bool, MCSession) -> Void = { status, session in }
在init方法中,必须传递初始化的MCSession实例,而不是nil

invitationHandler(false, session)

要忽略此错误,可以初始化invitationHandler属性,如下所示

var invitationHandler: (Bool, MCSession) -> Void = { success, session in }

谢谢,但是现在我只有一个新的错误:“Nil与预期的参数类型'MCSession'不兼容”,在这一行invitationHandler(false,Nil)之后,我得到了错误:属性'self.invitationHandler'未在super.init callhmm处初始化,ok。现在检查一下。