2011-07-07 32 views
51

Tôi là một người mới bắt đầu tại obj-C và tôi là một chút nhầm lẫn ở kịch bản này, tôi có đoạn mã sau:NSNumbers So sánh trong Objective C

if (number1 < number2) { 

      NSLog(@"THE FOLLOWING NUMBER "); 
      NSLog(@"%@", number1); 
      NSLog(@"IS LESS THAN"); 
      NSLog(@"%@", number2); 

} 

Khi tôi chạy mã này, tôi thấy kết quả thực sự kỳ lạ như thế này :

2011-07-06 20:38:18.044 helloworld[1014:207] THE FOLLOWING NUMBER 
2011-07-06 20:38:18.047 helloworld[1014:207] 190.8776 
2011-07-06 20:38:18.050 helloworld[1014:207] IS LESS THAN 
2011-07-06 20:38:18.053 helloworld[1014:207] 96.75866 

Cả hai số đều là đối tượng NSNumber, làm sao một cái gì đó như thế này xảy ra? Tôi nhận được hai con số bằng cách tìm khoảng cách giữa các sprites trên màn hình.

Bất kỳ manh mối hoặc lời khuyên nào thực sự sẽ được đánh giá là

+1

Cũng giống như một ghi chú, bạn có thể kết hợp những 'NSLog's bởi sử dụng 'NSLog (@ "THE NUMBER% @ LÀ DƯỚI% @", number1, number2); ' –

Trả lời

94

Tôi giả định số 1 và số 2 là con trỏ đến đối tượng. Các dấu hiệu < là so sánh các con trỏ.

Bạn cần phải so sánh floatValue thực tế hoặc doubleValue

if ([number1 doubleValue] < [number2 doubleValue]) 

....

+0

Cảm ơn rất nhiều Kal –

+34

Ngoài ra, bạn có thể thực hiện' if ([number1 compare: number2] == NSOrderedAscending) '. –

+3

Để cho bạn biết sự thật, tôi đã downvoted vì: a) So sánh 'float' vốn không nhất quán, và trung thực không hợp lệ (nếu có, so sánh 'float1'' float' giá trị trừ 'số2'' float' giá trị một số epsilon nhỏ), b) 'float' là ác, và không đáng tin cậy; 'double' s là con đường để đi, nếu có, và c) không bận tâm so sánh con số theo cách này nếu chúng là số nguyên. Nhận xét của @Adam Rosenfield là cách tốt nhất để làm điều đó; tin tưởng phương pháp so sánh 'NSNumber' để chăm sóc nó cho bạn. –

15

NSNumber có một phương pháp để so sánh: - (NSComparisonResult) so sánh: (NSNumber *) aNumber

if([numberOne compare:numberTwo] == NSOrderedSame) 
{ 
     // proceed 
} 
+3

Đây là cách chính xác và đáng tin cậy nhất để làm điều này, vì bạn không có nguy cơ mất độ chính xác. –

33

Đối với trường hợp bạn chỉ muốn kiểm tra xem hai thuộc tính NSNumber có giữ cùng một lue, sau đó từ tài liệu của Apple có vẻ như rằng việc sử dụng

- (BOOL)isEqualToNumber:(NSNumber *)aNumber 

là cách đơn giản và hiệu quả nhất để so sánh hai giá trị NSNumber.

Ví dụ:

if ([someNumber isEqualToNumber:someOtherNumber]) 
{ 
    // The numbers hold the same value 
} 
else 
{ 
    // The numbers hold different values 
} 

Các tài liệu cũng cho biết "Phương pháp này hiệu quả hơn so sánh:. Nếu bạn biết hai đối tượng là những con số"

Bất cứ khi nào bạn cần phải biết liệu một giá trị nhỏ hơn hoặc lớn hơn, họ cung cấp các phương pháp

- (NSComparisonResult)compare:(NSNumber *)aNumber 

, nhưng cá nhân tôi muốn vào thời điểm đó chỉ cần kéo ra các giá trị số nguyên (hoặc giá trị kép) và sử dụng các toán thường xuyên < và> thực hiện các so sánh, bởi vì đó là làm cho mã dễ dàng hơn để đọc, như vậy:

if (firstNumber.intValue > secondNumber.intValue) 
{ 
    // First number is greater than the second number 
} 
else if (firstNumber.intValue == secondNumber.intValue) 
{ 
    // The two numbers have the same value 
} 
else 
{ 
    // The first number is smaller than the second number 
} 

Something như thế là dễ dàng hơn để đọc hơn các cuộc gọi đến -compare :, theo ý kiến ​​của tôi.

Erik

+1

Bạn nói rằng bạn sẽ "kéo ra các giá trị số nguyên hoặc các giá trị kép". Cái nào? Phương pháp so sánh: sẽ so sánh chính xác cả số nguyên 64 bit và giá trị gấp đôi lớn không vừa với số nguyên. Trong trường hợp đầu tiên, việc trích xuất các giá trị kép sẽ thất bại. Trong trường hợp thứ hai, trích xuất các số nguyên sẽ thất bại. Sử dụng so sánh: công trình. – gnasher729

0

Swift 3,1

let number1 = NSNumber(value: 10.2) 
let number2 = NSNumber(value: 20.2) 
let result = number1.compare(number2) 
if result == .orderedAscending { 

} else if result == .orderedDescending { 

} else { // .orderedSame 

}