2011-08-06 53 views
18

Trong ứng dụng của tôi, có một cơ chế yêu cầu tại một điểm nhất định, hai số NSString sẽ giống nhau để làm điều gì đó; vì một số lý do khi tôi so sánh hai, ngay cả khi chúng giống nhau, nó vẫn không nhận ra điều đó. Mã này là một cái gì đó như thế này:So sánh hai số NSStrings

NSString * aString = [self someMethodThatGetsAString]; 

NSString * bString; 

BOOL areStringsTheSame = NO; 

while (areStringsTheSame != YES) { 

     bString = [self someMethodThatTakesNSStringsFromAnArrey]; 
     if (bString == aString) { 
      areStringsTheSame = YES; 
     { } 

Tôi thậm chí chèn một NSLog() và chắc chắn rằng tại một điểm nhất định họ là như nhau (và như xa như tôi biết điều này là những gì == là viết tắt của ...), nhưng nó vẫn không vào được if để thay đổi giá trị BOOL.

Có cách nào khác để so sánh này không? Tui bỏ lỡ điều gì vậy?

Trả lời

72

Bạn có thể sử dụng phương pháp isEqualToString::

if ([bString isEqualToString:aString]) 

== so sánh tài liệu tham khảo (địa chỉ của) các dây, và không phải là giá trị của chuỗi.

+2

Thật. Và đào sâu vào các nguyên tắc của OOP (hai đối tượng có cùng thuộc tính không nhất thiết phải là cùng một đối tượng). Nếu không, bạn sẽ gặp phải vấn đề này mỗi ngày trong cuộc sống của nhà phát triển của bạn :-) – vstrien

+0

Rõ ràng '==' cũng hoạt động tốt để so sánh các chuỗi phân biệt chữ hoa chữ thường, vì cách Objective-C sử dụng các biến chuỗi. Ví dụ, khai báo một chuỗi A và chuỗi B, và làm '==' và bạn sẽ thấy chúng được lưu trữ trong cùng một địa chỉ. –

2

Gần đây tôi đã bị sốc bởi thực tế là hai NSStrings giống nhau trên NSLog có thể khác nhau. Đó là bởi vì đôi khi NSString có thể chứa ký tự khoảng trắng 0. Hãy nhận biết điều đó và xem xét:

#define ZERO_WIDTH_SPACE_STRING @"\u200B" 

Để chinh phục này, bạn nên rửa sạch chuỗi của bạn từ zero ký tự khoảng trắng rộng trước khi so sánh:

NSMutableString *eMailToAdd = [NSMutableString string]; 

NSMutableCharacterSet *charSet = [[NSCharacterSet whitespaceCharacterSet] mutableCopy]; 
    //[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; 

    NSString *rawStr = [[tokenField textField] text]; 
    for (int i = 0; i < [rawStr length]; i++) 
    { 
     if (![charSet characterIsMember:[rawStr characterAtIndex:i]]) 
     { 
      [eMailToAdd appendFormat:@"%@",[NSString stringWithFormat:@"%c", [rawStr characterAtIndex:i]]]; 
     } 
    } 
3

Cách tiếp cận này làm việc cho tôi:

if ([firstString compare:secondString] == NSOrderedSame) { 
    //Do something when they are the same 
} else { 
    //Do something when they are different 
}