Swift数组的处理程序块

时间:2014-09-12 10:13:28

标签: swift objective-c-blocks

在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数组。

1 个答案:

答案 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)