2012-01-06 15 views
1

我仍然試圖讓我的頭在如何選擇器和動態類型工作在目標c。我基本上是試圖實現這種方法(在Python /僞代碼,同樣的事情真的如下圖所示:P)如何根據屬性值/如何使用選擇器來確定對象是否在數組中?

def isInArray(value, array, test): 
    for item in array: 
     if test(item) == value: 
      return True 
    return False 

test = lambda obj: obj.property 

我預期的Objective-C代碼爲:

+ (BOOL)value:(id)value: 
    isInArray:(NSMutableArray *)array 
usingSelector:(SEL)selector { 
    for (id item in array) { 
     if (value == [item selector]) { 
      return YES; 
     } 
    } 
    return NO; 
} 

但是,這將引發編譯錯誤,抱怨我在if語句中比較兩個指針類型(id和SEL)

不應該如果語句是比較對象值與在對象arritem上運行SEL選擇器返回的對象嗎?換句話說,它爲什麼認爲它比較了o與SEL對象(我不明白什麼會返回一個SEL)

回答

3

結帳performSelectorNSObject。有條件會是什麼樣子,

if (value == [item performSelector:selector]) 

通過使用Key Value Coding(KVC),你的代碼會變得更加簡單。假設您有一個名爲people的數組,其中每個人都是類Person的對象。 A Person具有firstNamelastName屬性,並且您希望獲得people陣列中名字與"John"匹配的所有人。您可以獲取所有名字的數組,然後在該數組中查找名稱"John"

NSArray *firstNames = [people valueForKey:@"firstName"]; 
if ([firstNames containsObject:@"John"]) { 
    .. 
} 

即使我們使用valueForKey,它實際上做的firstName方法的調用,而不是直接訪問值。

+0

謝謝,我知道我錯過了一些明顯的東西! – sapi 2012-01-06 09:22:23

0

至少有一個我在方法定義中看到的錯誤。變量名稱後不需要添加冒號(在您的案例中爲value)。並且您應該使用performSelector:來使用您的選擇器進行對象檢查。

+ (BOOL)value:(id)value 
    isInArray:(NSMutableArray *)array 
usingSelector:(SEL)selector { 
    for (id item in array) { 
     if ([item performSelector:selector] == value) { 
      return YES; 
     } 
    } 
    return NO; 
} 

在某些情況下,你需要使用isEqualTo:isEqualToString:(如果你處理字符串),而不是==因爲==,如果是同一個對象會返回true。

另外,如果你只需要檢查一些對象存在於NSArray的,比你可以使用containsObject:(如果返回true)和indexOfObjectPassingTest:(對象的回報指數或「NSNotFound」)

+0

謝謝,這就是我之後:)我試圖避免使用indexOfObjectPassingTest(它看起來很複雜)。你是什​​麼意思== vs isEqualTo?我認爲==是通過內置基本類型(字符串等)的值以及默認情況下NSObject的引用。哦,不知道如何結腸蠕動:P – sapi 2012-01-06 09:25:08

+0

看到這個我的小例子:https://gist.github.com/1569913我測試那裏'isEqual:','isEqualToArray:'方法和'=='操作符兩個具有相同對象的數組。正如你所看到的,我的例子'isEqual:'與'isEqualToArray:'的工作方式相同,我想它在NSArray類中重寫以調用'isEqualToArray:'。如果兩個數組都具有相同的對象,那麼它們與這兩個方法的比較會返回true,但如果使用'=='運算符,則會因爲它是內存中的兩個不同對象而變爲false。希望它可以幫助你;) – yas375 2012-01-06 09:53:12

+0

是的,謝謝。與我以前用過的相比,它們的功能倒退了,但是現在我知道了:) – sapi 2012-01-06 09:57:50

相關問題