gpt4 book ai didi

cocoa - 如何指定 NSDictionary 的keysOfEntriesPassingTest 所需的 block 对象/谓词?

转载 作者:行者123 更新时间:2023-12-03 16:12:37 30 4
gpt4 key购买 nike

出于学习(尚不实用)的目的,我想在 NSDictionary 上使用以下方法,通过我定义的测试返回一组具有值的键。不幸的是不知道如何指定谓词。

NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate

比方说,我的所有值都是 NSURL,我想取回端口 8080 上的所有 URL。这是我的编码尝试 — 尽管对我来说这并没有什么意义是正确的:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}]

那是因为我收到以下编译器错误:

incompatible block pointer types initializing 'void (^)(struct objc_object *, struct objc_object *, BOOL *)', expected 'BOOL (^)(struct objc_object *, struct objc_object *, BOOL *)'

我错过了什么?我很感激一些文档的指针,这些文档更详细地介绍了谓词应该是的“ block 对象”。
谢谢!

<小时/>

这是有效的代码:

NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
return YES;
else
return NO;
}];

最佳答案

对巴里的答案进行一点扩展......

block 就像一个函数指针,但有一个关键区别。 block 将从包含在中的返回语句推断返回类型,它会给出类似于您所说的错误消息(LLVM编译器的错误应该更合理一些)。

当你写道:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}]

将其视为一个函数:

BOOL bob(id key, id obj) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}
}

看出问题了吗?有一个代码路径不返回值,因此编译器会提示。

关于cocoa - 如何指定 NSDictionary 的keysOfEntriesPassingTest 所需的 block 对象/谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034251/

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