代码之家  ›  专栏  ›  技术社区  ›  Itay

如何指定nsDictionary的keysOfEntriesPassingTest所需的块对象/谓词?

  •  4
  • Itay  · 技术社区  · 7 年前

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

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

    例如,我的所有值都是nsurls,我想返回端口8080上的所有URL。这是我在编码方面的一个尝试——尽管它对我来说并不真正有意义,但它是正确的:

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

    这是因为我返回了以下编译器错误:

    初始化“void(^)(struct objc_object*,struct objc_object*,bool*)”时块指针类型不兼容,应为“bool(^)(struct objc_object*,struct objc_object*,bool*)”

    我错过了什么?我希望能有一个指向一些文档的指针,这些文档能够更详细地介绍 谓语 应该是。
    谢谢!


    这就是代码:

    NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
    {
      if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
         return YES;
       else
         return NO;
    }];
    
    2 回复  |  直到 13 年前
        1
  •  3
  •   Barry Wark    16 年前

    错误表明块必须返回 BOOL 而不是 id . 检查文档。我怀疑你会回来 YES 如果key/obj对通过了所需的测试。

        2
  •  7
  •   bbum    16 年前

    稍微扩展一下巴里的回答……

    块就像一个有一个键差的函数指针。块将从包含在 它将给出一个如您所说的错误消息(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;
        }
    }
    

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