我找到了一个Objective-C SocketIO library,我正试图在我的第一个Swift应用程序中实现它。这是我尝试移植的代码:
__weak typeof(self) weakSelf = self;
self.socket.onConnect = ^()
{
weakSelf.socketIsConnected = YES;
[weakSelf mapView: weakSelf.mapView didUpdateUserLocation: weakSelf.mapView.userLocation];
};
根据我的有限理解^() {}
是目标C中的一个块。我已经查看了它并closures seem to be a loose equivalent Swift。我的第一个显而易见的问题是如何在Swift中获得相同的结果?
我已尝试以下操作,但收到错误fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
:
self.socket.onConnect = { () -> Void in
println("Connected!")
}
此外,在幕后发生了什么?异步回调函数似乎是合适的,但没有使用,我想了解原因。
更新
正如@jtbandes所指出的那样,socket
实际上是Nil,因为这段代码在连接回调之外运行(我知道,这是一个非常愚蠢的错误)。解决第一个问题:
SIOSocket.socketWithHost(server) { (socket: SIOSocket!) in
self.socket = socket
self.socket.onConnect = { () -> Void in
println("Connected!")
}
}
答案 0 :(得分:2)
Objective-C块和Swift闭包不仅仅是松散的等价物。它们是直接的等价物。
块/闭包是一个匿名函数,它继承了它的封闭范围。
我还在Objective-C工作,所以我习惯了它的术语。我将使用这些条款
块在很多方面都很有用。
完成代码就是一个例子。
如果没有阻止,如果您正在设置异步网络类,则可以为其指定一个委托属性,并定义一个带有回调的协议,该类用于通知其委托有关下载完成等事件的代理,错误等。
这使得很多不同地方的消息处理基础设施成为可能。您必须定义协议。您必须将一个委托属性添加到网络类。您必须在客户端类中实现一组委托消息。您可能必须将上下文信息传递给回调等。
使用块,您可以调用请求网络服务的方法,并提供完成块。服务完成后,它会调用提供的代码块。您可以将参数添加到完成块,如指向数据的指针,成功布尔值或任何适当的参数。代码块可以访问其封闭范围中定义的所有变量,这可能非常有用。
您还可以将块保存到集合中,可以在排序方法中使用块,也可以在很多其他情况下使用块。
您发布的代码只是在有问题的对象self.socket上设置了一个块属性。它看起来像是在建立套接字连接后调用的代码块。
Swift中有直接的等价物。不过,我只是在Swift中闲逛,所以我会把它留给别人来帮助你翻译。
我建议浏览Apple的课程,了解如何使用块的想法。如果您对异步网络感兴趣,请查看NSURLConnection和NSURLSession。看一下采用动画块和完成块的基于块的视图动画方法。这些将让您了解如何使用块来处理异步事件,或将代码传递给类来完成工作。
块的另一个有趣用途是处理像数组这样的集合。有一些方法可以使用NSComparator块并对数组进行排序,并且有一些方法将枚举数组,在每个元素上执行代码块和/或选择元素的子集并返回数组索引的索引集
邓肯