为什么这个快速代码错了?

时间:2017-12-27 12:19:31

标签: swift multipeer-connectivity

由于某些原因,因为我更新后我在使用MultiPeer连接时遇到以下错误,我似乎无法弄清楚:

  

"类型MessageServiceManager不符合协议MCSession"

一切都过去完美无缺,但现在由于某种原因,一切都被打破了,我不知道为什么。 这是它所有解决的代码:

extension MessageServiceManager : MCSessionDelegate {
  func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())")
    self.delegate?.connectedDevicesChanged(self, connectedDevices: session.connectedPeers.map({$0.displayName}))
  }

  func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    NSLog("%@", "didReceiveData: \(data)")
    let str = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    self.delegate?.messageChanged(self, messageString: str)
  }

  func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
    NSLog("%@", "didReceiveStream")
  }

  func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL??, withError error: Error?) {
    NSLog("%@", "didFinishReceivingResourceWithName")
 }

  func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
    NSLog("%@", "didStartReceivingResourceWithName")
  }
}

2 个答案:

答案 0 :(得分:3)

你有一个双重问号' ??'其中一种方法。

所以改变这个:

func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL??, withError error: Error?) {
    NSLog("%@", "didFinishReceivingResourceWithName")
}

到此:

func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
    NSLog("%@", "didFinishReceivingResourceWithName")
}

请注意删除'?' URL后的字符。

答案 1 :(得分:0)

当提到:

  

类型MessageServiceManager不符合协议MCSession

这意味着您您班级中所有必需的方法都符合MCSessionDelegate

要解决此类问题,您可以按命令并单击MCSessionDelegate,然后选择"跳转到定义&#34 ;;这应该会引导你:

// Delegate methods for MCSession.
public protocol MCSessionDelegate : NSObjectProtocol {


    // Remote peer changed state.
    @available(iOS 7.0, *)
    public func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState)


    // Received data from remote peer.
    @available(iOS 7.0, *)
    public func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID)


    // Received a byte stream from remote peer.
    @available(iOS 7.0, *)
    public func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID)


    // Start receiving a resource from remote peer.
    @available(iOS 7.0, *)
    public func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress)


    // Finished receiving a resource from remote peer and saved the content
    // in a temporary location - the app is responsible for moving the file
    // to a permanent location within its sandbox.
    @available(iOS 7.0, *)
    public func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?)


    // Made first contact with peer and have identity information about the
    // remote peer (certificate may be nil).
    @available(iOS 7.0, *)
    optional public func session(_ session: MCSession, didReceiveCertificate certificate: [Any]?, fromPeer peerID: MCPeerID, certificateHandler: @escaping (Bool) -> Swift.Void)
}

这是协议的声明。

现在您可以识别您必须实现的方法(所有非可选方法)或方法签名是否匹配;你会注意到:

session(_:didFinishReceivingResourceWithName:fromPeer:at:withError:)

不是实现的,这就是让编译器抱怨的原因,显然你要做的就是将其实现为:

func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
    // your logic goes here...
}