在objective-c中,我在.h文件中有一个代码:
typedef void(^SocketConnectionLost)();
typedef void(^SocketIOCallback)(id argsData);
@interface SocketConnection
@property (strong, nonatomic) SocketIO *socketIO;
@property (strong, nonatomic) NSMutableArray *socketConnectionLosts;
-(void)sendEventWithName:(NSString*)eventName
withData:(id)data
onConnectionLost:(SocketConnectionLost)connectionLost
onAnswer:(SocketIOCallback)answer;
@end
我在.m文件中有一个代码:
@implementation SocketConnection
- (void)init {
self.socketIO = [[SocketIO alloc] initWithDelegate:self];
[self.socketIO setReturnAllDataFromAck: YES];
[self.socketIO connectToHost:kSocketHost onPort:kSocketPort withParams:params];
}
- (void) socketIODidDisconnect:(SocketIO *)socket
disconnectedWithError:(NSError *)error {
for(ServerRequestConnectionLost connectionLost in self.socketConnectionLosts)
if(connectionLost)
connectionLost();
[self.socketConnectionLosts removeAllObjects];
}
-(void)sendEventWithName:(NSString*)eventName
withData:(id)data
onConnectionLost:(SocketConnectionLost)connectionLost
onAnswer:(SocketIOCallback)answer {
[self.socketConnectionLosts addObject:connectionLost];
[self.socketIO sendEvent:eventName withData:data andAcknowledge:^(id argsData) {
if(connectionLost)
[self.socketConnectionLosts removeObject:connectionLost];
if(answer)
answer(argsData);
}];
}
@end
请帮我在Swift中重现这段代码,我不明白如何在NSArray上创建,添加和删除带有Array的Swift块
这就是我尝试在Swift中创建一些块的方法:
var someBlock: ()->()
var connectionLosts = NSMutableArray()
connectionLosts.append(someBlock)
编译器显示错误:输入'() - >()'不确认协议'AnyObject'
然后我需要从数组中删除someBlock,比如obj-c中的[self.socketConnectionLosts removeObject:connectionLost],我不明白如何使用Swift数组。
答案 0 :(得分:15)
你不必使用一个Objective-c数组,只需一个快速数组。看看这个:
typealias ClosureType = () -> ()
var someClosure: ClosureType = { println("Closure executed") }
var array = [ClosureType]()
array.append(someClosure)
array[0]()
如果您在游乐场中运行,最后一行将打印Closure executed
。
NSArray
无效的原因是它在swift中被桥接为AnyObject
的数组 - 但AnyObject
是任何类的实例输入,显然闭包是而不是一个类。
至于从数组中删除项目,这是一个更复杂的问题。无法使用find
,因为它需要数组类型来实现Equatable
协议,但是闭包不会实现它,并且它们无法扩展。
也许不是使用数组,你可以使用一个字典,根据你的应用程序逻辑使用一个对你有意义的键类型 - 例如文本名,枚举等。例如,如果你使用枚举:
enum ClosureEnum {
case TEST_ELEMENT
}
var dict = [ClosureEnum:ClosureType]()
dict[.TEST_ELEMENT] = someClosure
dict[.TEST_ELEMENT]!()
请注意!
中的dict[.TEST_ELEMENT]!()
,因为字典中的查找始终返回可选项。您可以像这样使用强制解包,或将其包含在可选绑定中以获得更安全的代码。
要删除元素,只需使用正确的方法:
dict.removeValueForKey(.TEST_ELEMENT)