2011-11-15 143 views
14

我正在研究檢查數組以查看它是否包含某個字符串的應用程序。然而,它似乎並沒有正確的工作,因爲我認爲它可能在查看字符串的情況。 在這段代碼中,我將如何確保containsObject:不區分大小寫?NSArray中的大小寫不敏感containsObject:

if ([myArray containsObject:term]) {...} 

請問你是否需要說明,謝謝你的幫助。

(另外,我發現這樣一個問題:Case insensitive comparison NSString我不知道這是我需要的,如果是,我將如何使用它。)

回答

6

NSArray是(目的地)不知道它擁有什麼。因此,它不知道NSString,更不用說區分大小寫。你將不得不遍歷數組的項目並進行比較。您可以使用通過數組循環的許多不同的方法之一:

  • objectEnumerator
  • indexOfObjectPassingTest:它使用塊來執行您的操作。
  • 爲每個項目調用objectAtIndex:

我會建議前2個選項之一。

+0

我得看看這個,當我得到機會。謝謝! – thekmc

24
if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
     return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame); 
    }] != NSNotFound) { 
    // there's at least one object that matches term case-insensitively 
} 
0
- (BOOL)containsObject:(id)anObject 

是,你可以不適用你的目的的便捷方法。這裏是文檔討論:

該方法確定由 anObject是否存在於該陣列中的發送的isEqual:消息發送到每個陣列的對象(和 傳遞anObject作爲參數給每個isEqual:方法消息)。

一般的NSObject方法isEqual:方法不能考慮字符串的情況。如果你可以使用塊(iOS 4),最好的解決方案可能就是Kevin Ballard的主張。如果沒有,那麼你可能需要迭代字符串。

-1
if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame) { 
    //... 
} 

這一個可能對你有用...所有最好的

14

下面是使用鍵 - 值編碼的有效途徑。

NSArray *strings; // array of strings 
if ([[strings valueForKey:@"lowercaseString"] containsObject:[searchString lowercaseString]]) { 
    NSLog(@"searchString found"); 
} else { 
    NSLog(@"searchString NOT found"); 
} 

斯威夫特3選項:

let things = ["foo", "Bar"] 
let searchString = "FOO" 

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) { 
    print("found searchString") 
} else { 
    print("searchString not found") 
}