2010-06-13 50 views
4

對於學習(不實用 - 但)的目的,我想在NSDictionary上使用以下方法,讓我回到一組使用我定義的測試值的鍵。不幸的是,不知道如何指定謂詞。如何指定NSDictionary的keysOfEntriesPassingTest所需的塊對象/謂詞?

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; 
       }] 

那是因爲我得到以下編譯器錯誤:

incompatible block pointer types initializing 'void (^)(struct objc_object *, struct objc_object *, BOOL *)', expected '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; 
}]; 
+0

感謝提問/回答;我在上面的「代碼有效」部分修正了一個錯字。 – petert 2011-04-14 09:49:54

回答

3

的錯誤表明您塊必須返回一個BOOL,而不是id。檢查文檔。如果key/obj對通過期望的測試,我懷疑你會返回YES

+0

嘿,你知道些什麼..這些日誌消息,很有用!謝謝。 – Todd 2010-06-13 23:22:05

+0

請注意,你會遇到同樣的錯誤是你返回一個布爾值。 BOOL和bool類似但不相同;這是他們不可互換的一種情況。 – 2012-01-12 20:06:21

7

在巴里的回答有點膨脹....

塊就像是一個關鍵區別在於一個函數指針。一個塊將從中包含的返回語句中推斷返回類型,它會給出類似於您所說的錯誤消息(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; 
    } 
} 

看這個問題?有一個代碼路徑不會返回值,因此編譯器會抱怨。