Posted at

Swift2.0でエラー Cannot invoke 'sendData' with an argument list of type...の対処法

More than 3 years have passed since last update.


エラーメッセージ


  • Swift1.2 → 2.0にしたところ、以下の文法エラーが出るようになりました

Cannot invoke 'sendData' with an argument list of type '(NSData?, toPeers: [MCPeerID], withMode: MCSessionSendDataMode, error: inout NSError?)'


原因



  • 公式ドキュメントのAPI Diffを確認

  • Swift1.2 → Swift2.0でMultipeerConnectivityのsendDataメソッドのAPIが変更になりました

  • 4つ目の引数の error がなくなって、throws がついています


MCSession.h(swift1.2)

func sendData(_ data: NSData!, toPeers peerIDs: [AnyObject]!, withMode mode: MCSessionSendDataMode, error error: NSErrorPointer) -> Bool



MCSession.h(swift2.0)

func sendData(_ data: NSData, toPeers peerIDs: [MCPeerID], withMode mode: MCSessionSendDataMode) throws



対処法


  • APIを引数3つへ変更します。throwsに対応して、以下のように do~try~catch を実装します


Swift1.2


swift1.2.swift

        self.session.sendData(msg, toPeers: self.session.connectedPeers,

withMode: MCSessionSendDataMode.Unreliable, error: &error)



Swift2.0


swift2.0.swift

        do {

try self.session.sendData(msg!,
toPeers: self.session.connectedPeers,
withMode: MCSessionSendDataMode.Unreliable)
} catch {
// do something.
}


  • Objective-CのAPI変更では、非推奨期間があったりメソッドの宣言に飛べば「iOS7から変更になったよ」等コメントされていたと思うのですが、Swiftは変更が多いためそういったフォローがなくエラーメッセージが少し分かりにくいですね


参考