1

我试图用 swift 重写我的 GameKit 多人游戏(本地),并且遇到了一些缺少该语言文档的问题。我想从另一个对等方接收数据,所以我为我的 GKSession 设置了 dataReceiveHandler,如下所示:

session.setDataReceiveHandler(self, withContext: nil)

在苹果文档中,它说 dataReceiveHandler 必须实现具有此签名的方法:

SEL = -receiveData:fromPeer:inSession:context:

在objective-c文档中是一个签名应该是什么样子的例子:

- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context;

如果我尝试快速重写此方法,它看起来像这样:

func receiveData(data: NSData, fromPeer peer: String, inSession session: GKSession, withContext context: CMutableVoidPointer) {
    println("received data: \(data)")
}

当我收到一条消息时给我这个错误:

Domain=com.apple.gamekit.GKSessionErrorDomain Code=30500 "Invalid parameter for -setDataReceiveHandler:withContext:" UserInfo=0x178462840 {NSLocalizedDescription=Invalid parameter for -setDataReceiveHandler:withContext:, NSLocalizedFailureReason=处理程序没有响应正确的选择器。}

这意味着我的方法没有正确的签名。但是什么是正确的?

4

3 回答 3

2

这是重命名参数的问题。你写withContext context而不是context withContext. 第一个名字是会暴露给调用者的名字。

这应该有效:

func receiveData(data: NSData, fromPeer peer: String, inSession session: GKSession, context: CMutableVoidPointer) {
    println("received data: \(data)")
}
于 2014-06-09T12:06:37.703 回答
1

抱歉,我必须再次编辑此内容,但我现在有了实际答案:

不要使用 GKSESSION!自 iOS7 以来已弃用!

利用:

MultipeerConnectivity.framework

于 2014-06-09T18:43:36.330 回答
0

您可能需要将参数的类型声明为可选项(不确定这是否适用于 void 指针),即func receiveData(data: NSData?, fromPeer peer: String?, inSession session: GKSession?, withContext context: CMutableVoidPointer)(您也可以使用!而不是?隐式展开的可选项)。

这些参数是Objective-C 中的指针,即它们可能是nil您当前的代码无法表示的指针,因此它没有正确的签名。在 Swift 中表示可能nil值的方法是使用可选项。

于 2014-06-09T11:35:05.450 回答