2015-11-03 84 views
1

我試着this tutorial,因爲新的swift版本出現了一些錯誤,其中一個是MPCManager不符合協議MCNearbyServiceAdvertiserDelegate。Swift:無法賦值'(Bool,MCSession) - > Void'鍵入'(Bool,MCSession!) - > Void!'

我試圖來解決它,所以我改變FUNC廣告客戶的首標到這一個:

FUNC廣告(廣告客戶:MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer的peerID:MCPeerID,withContext上下文: NSData的?, invitationHandler:(布爾,MCSession) - >無效){

,但隨後引發我一個錯誤

無法賦值'(Bool,MCSession) - >無效'鍵入'(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) { } 

    } 
+0

你能否把有問題的代碼片段放到你的問題中? – courteouselk

+0

已編輯!現在呢? –

+0

你能解決這個問題嗎? – Gamerlegend

回答

0

您與(Bool, MCSession!)->Void!類型定義的變量invitationHandler,然後用值(Bool, MCSession)->Void)類型分配它。這是導致錯誤信息的原因。

要解決該問題,請使用參數匹配類型和invitationHandler變量定義advertiser方法。

+0

如果我這樣做,我再次顯示第一個錯誤,MPCManager不符合我看到的協議MCNearbyServiceAdvertizerDelegate –

+0

。所以,你必須在'advertiser'方法中改變'invitationHandler'匹配類型的定義。 – t4nhpt

+0

試過了,那麼它會拋出一個錯誤invitationHandler必須在init func中初始化,我該如何初始化這樣一個var? –

0

酒店類MPCManagerinvitationHandler被定義爲:

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

...而invitationHandleradvertiser方法的參數定義爲

invitationHandler: (Bool, MCSession) -> Void 

有2個錯配的位置:

  • Property's return value is Void!而參數返回Void
  • 屬性的第二個參數是MCSession!而方法需要MCSession

首先,我不明白這一點有Void!作爲返回值。 Void意味着什麼都沒有被返回,所以不需要隱式地解開它。

其次,參數的類型必須匹配。所以,無論是應該是MCSession或兩個MCSession!

E.g.以下不會產生你提到的錯誤:

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

// ... 

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