2017-12-27 18 views
0

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") 
    } 
} 
+0

エラーメッセージは、あなたのクラスが 'MCSessionDelegate'に準拠していないことを知っていることを伝えます - 自動補完を使用するか、' MessageServiceManager'がプロトコルから逃しているものを手動で確認してください。 –

+0

proble – SemAllush

答えて

0

を:

タイプMessageServiceManagerはあなたがないことを意味し、そのプロトコルMCSession

に準拠していません。クラスに必要なすべてのメソッドがMCSessionDelegateに適合するようにしてください。

このような問題を解決するには、コマンドを押してMCSessionDelegateをクリックしてから、「Jump to Definition」を選択します。

プロトコルの宣言です
// 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... 
} 
3

あなたには二重の疑問符「??」があります。これらの方法の1つである。

だから、これを変更します。これに

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の後の文字。

関連する問題