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

问题描述 投票:0回答:2

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

“类型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")
  }
}
swift multipeer-connectivity
2个回答
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后面的字符。


0
投票

当提到:

类型MessageServiceManager不符合协议MCSession

这意味着你并不是所有必需的方法都符合MCSessionDelegate

要解决这个问题,您可以按命令并单击MCSessionDelegate然后选择“跳转到定义”;这会引导你:

// 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...
}
© www.soinside.com 2019 - 2024. All rights reserved.