2012-09-11 30 views
6

Tôi thực sự thích các chữ mới trong Mục tiêu-C. Tôi tự hỏi nếu với những bổ sung mới có một cách tốt hơn để so sánh các con số.So sánh các chữ số NSNumber

Ví dụ, nếu tôi muốn so sánh ab:

a = @1; 
b = @2; 

là cách duy nhất để so sánh chúng như thế này:

[a intValue] > [b intValue] 

Hoặc là có tốt hơn, thanh lịch hơn, giải pháp?

+0

Nếu bạn muốn, bạn có thể viết một thể loại thêm các phương thức như '[a greaterThan: b]' và '[a equalTo: b]' – pasawaya

+0

Có thể biên dịch của các toán tử sẽ xuất hiện dưới dạng phần mở rộng của số này. cú pháp. '@ 1' đã trở thành' [NSNumber numberWithInt: 1] '- không có lý do gì mà' @ 1> @ 2' không thể được phép và viết lại thành '[@ 1 isGreaterThan: @ 2]' (tốt, không có lý do nào ngoài sự nhầm lẫn có thể xảy ra: "Tại sao tôi không thể làm' nếu (1> @ 2) '?"). –

+0

yea bạn nói đúng, nó sẽ loại bỏ các so sánh con trỏ ở mức độ thấp ... nhưng chúng luôn có thể làm điều gì đó như @ 1 @> = @ 2 và sau đó triển khai largerThanOrEqualTo trong NSNumber, vì vậy nó sẽ được dịch thành [@ 1 greaterThanOrEqualTo: @ 2] ... theo cách này bạn có thể giữ số học con trỏ của bạn cũng như so sánh logic – 0xSina

Trả lời

13

Đối với kiểm tra bình đẳng, bạn có thể sử dụng isEqualToNumber mà kiểm tra nếu một trong hai nội dung id hoặc tương đương (với sau này sử dụng compare):

if ([a isEqualToNumber:b])     // if a == b 

Không chắc tại sao họ cũng không triển khai các phương thức tiện lợi isGreaterThanNumberisLessThanNumber (và có thể cả >=<=), vì phương thức compare bên dưới có vẻ hơi khó khăn.

Đối với kiểm tra sự bất bình đẳng, chỉ cần sử dụng compare trực tiếp (bạn cũng có thể làm điều này cho bình đẳng như có thể được nhìn thấy từ cái đầu tiên bên dưới):

if ([a compare:b] == NSOrderedSame)   // if (a == b) 
if ([a compare:b] == NSOrderedAscending) // if (a < b) 
if ([a compare:b] == NSOrderedDescending) // if (a > b) 

if ([a compare:b] != NSOrderedSame)   // if (a != b) 
if ([a compare:b] != NSOrderedAscending) // if (a >= b) 
if ([a compare:b] != NSOrderedSescending) // if (a <= b) 

chi tiết có thể được tìm thấy trên NSNumber class documentation page.


Hãy nhớ không có gì ngăn cản bạn từ việc tạo helper riêng chức năng của bạn mà sẽ, ví dụ, cho phép mã như là:

if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no) 

hay:

if (nsnComp2 (a, b) >= 0) ... // returns -1/0/+1 

mặc dù nó ít Objective-C và nhiều C :-) Nó phụ thuộc vào việc định nghĩa của bạn về "thanh lịch" bị ràng buộc chủ yếu bởi hiệu quả hay khả năng đọc. Cho dù đó là thích hợp với tùy chọn intValue của bạn là một quyết định bạn sẽ cần phải tự mình làm.

+0

Quá nhanh cho tôi! : D – Zhang

+0

Vâng, có lẽ chỉ được thêm 'isEqualToNumber:' bởi vì các phương thức 'isEqualTo ...' được sử dụng ở nhiều nơi khác [như 'isEqualToString:']. Chỉ cần IMHO. – Mazyod

+0

Cảm ơn ... không biết về so sánh, nhưng bạn vẫn không biết> = hoặc <= .... sẽ tuyệt vời hơn nếu họ đã làm @ 1 == @ 2 ... nhưng tôi hiểu tại sao không . – 0xSina

7

NSNumber thực hiện -compare: (cũng như một số lớp khác). Vì vậy, bạn có thể nói

switch ([a compare:b]) { 
    case NSOrderedAscending: // a < b 
     // blah blah 
     break; 
    case NSOrderedSame: // a == b 
     // blah blah 
     break; 
    case NSOrderedDescending: // a > b 
     // blah blah 
     break; 
} 
0

NSNumber cũng có một isEqualToNumber:

0

Dưới đây là đoạn mã để kiểm tra hoạt động tốt:

NSLog(@"%d", number1 == number2); 
NSLog(@"%d", [number1 isEqual:number2]); 
NSLog(@"%d", [number1 isEqualToNumber:number2]); 

Sản lượng:

1 
1 
1 

Kết luận:

Để hiểu so sánh, bạn cần hiểu phân bổ cá thể.NSNumber thực hiện nội bộ bộ nhớ cache của các đối tượng được chỉ định và ánh xạ các đối tượng hiện có tới bất kỳ đối tượng mới được tạo nào sử dụng các giá trị. Nếu một đối tượng NSNumber hiện có được tìm thấy đang giữ giá trị 1, thì không có cá thể NSNumber mới nào được tạo.