gpt4 book ai didi

处理程序 block 的 Swift 数组

转载 作者:可可西里 更新时间:2023-10-31 23:54:52 25 4
gpt4 key购买 nike

在 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 block

这就是我尝试在 Swift 中创建一些 block 的方式:

var someBlock: ()->()
var connectionLosts = NSMutableArray()
connectionLosts.append(someBlock)

编译器显示错误:类型 '()->()' 不确认协议(protocol) 'AnyObject'

然后我需要从数组中删除 someBlock,例如 obj-c 中的 [self.socketConnectionLosts removeObject:connectionLost],我不明白如何使用 Swift 数组来完成它。

最佳答案

您不必使用 objective-c 数组,只需使用 swift 数组即可。检查一下:

typealias ClosureType = () -> ()

var someClosure: ClosureType = { println("Closure executed") }

var array = [ClosureType]()

array.append(someClosure)

array[0]()

如果你在 Playground 上运行它,最后一行将打印Closure executed

NSArray 不起作用的原因是它在 swift 中桥接为 AnyObject 的数组 - 但 AnyObject 是 < em>任何类类型的实例,显然闭包不是类。

至于从数组中删除一个项目,那是一个更复杂的问题。 find 不能使用,因为它需要数组类型来实现 Equatable 协议(protocol),但是闭包没有实现它,它们也不能被扩展。

也许您可以使用字典,而不是使用数组,根据您的应用程序逻辑,使用对您有意义的键类型 - 例如文本名称、枚举等。例如,如果您使用枚举:

enum ClosureEnum {
case TEST_ELEMENT
}

var dict = [ClosureEnum:ClosureType]()
dict[.TEST_ELEMENT] = someClosure
dict[.TEST_ELEMENT]!()

请注意 dict[.TEST_ELEMENT]!() 中的 !,这是必需的,因为字典中的查找总是返回一个可选值。您可以像那样使用强制解包,或将其包含在可选绑定(bind)中以获得更安全的代码。

要删除一个元素,只需使用正确的方法:

dict.removeValueForKey(.TEST_ELEMENT)

关于处理程序 block 的 Swift 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25805920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com