更改块回调中的参数类型

时间:2012-02-01 09:31:16

标签: iphone objective-c objective-c-blocks

我最近在Apple工程师的WWDC视频中看到了一些示例代码。他正在使用NSArray的{​​{1}}方法,但是我注意到块的第一个参数不是{I},因为我习惯了,但是已经改为具体类型了开发人员知道是在阵列中。

例如,我只是在Xcode中使用了一切,一切正常:

enumerateObjectsUsingBlock:

id的声明声明第一个块参数为NSArray *test = [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; [test enumerateObjectsUsingBlock:^(NSString *aString, NSUInteger idx, BOOL *stop) { // ... }]; 类型:

enumerateObjectsUsingBlock:

现在我明白id可以用来代表任何Objective-c类型,但这个带参数的小技巧对我来说是未知的。

该语言的此功能是否有任何文档?这可以用在你也有- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block 参数的常规方法中吗?这是否安全或完全支持?

2 个答案:

答案 0 :(得分:1)

这是关于id类型的link to apple doc。 这个技巧可以在任何发送id的方法中使用,只要你对某个类型确定,或者在使用它之前检查它,它就是安全的。

答案 1 :(得分:0)

非常等于:

[test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *aString = (NSString*)obj;
    // ...
}];

请注意,在快速枚举的for循环中存在明确的并行:

for (id obj in test) {
    NSString *aString = (NSString*)obj;
    // ...
}

VS

for (NSString *aString in test) {
    // ...
}

但没有指向文档的链接 - 抱歉!