2011-10-05 44 views
2

我正在實現一些自定義NSArray排序選擇器,我想知道是否有像C/Objective-C中的< =>運算符?C/Objective-C中有Perl的「<=>」運算符嗎?

我有這樣的:

if (self.count == otherObject.count) return 0; 
return (self.count > otherObject.count)? 1 : -1; 

,很想有(如在Perl)

return self.count <=> otherObject.count; 
+3

嘿Dani,那裏的憤怒:)))我只是問是否有這樣的操作符 - 如果沒有這個操作符,那就沒有戲劇了 –

+1

@Dani:沒有理由編譯語言不能或不應該,有一個像'<=>'這樣的運營商。這是一個完全合理的問題。答案恰好是否定的。 –

回答

7

也許compare:方法是你在找什麼? NSString,NSNumber等實施它。 Cocoa中的所有類比方法返回NSComparisonResult:

enum { 
    NSOrderedAscending = -1, 
    NSOrderedSame, 
    NSOrderedDescending 
}; 
typedef NSInteger NSComparisonResult; 

所以你可以直接使用返回的整數值。假設count在你的問題是一個NSNumber你可以這樣做:

return [self.count compare:otherObject.count]; 

如果你的情況是有限的,以數字和要使用只是一個運營商,你可能可以使用好老減去。但要注意整數溢出!:

return self.count - otherObject.count; 
+0

Mattias,這正是我一直在尋找的東西:)所有這一次我以某種方式假定「比較:」應該返回{-1,0,+ 1},並且不知道它可能是任何正整數或負整數。 。因此...您的金色「返回self.count - otherObject.count」行正是我所尋找的 –

+0

很高興我能幫上忙!但是在使用減號的時候要注意,如果被比較的數字可能相距很遠,則不會導致整數溢出。考慮'return INT_MIN - INT_MAX'的情況。在你的情況下,我猜'count'是一個'NSUInteger',而'NSComparisonResult'是'NSInteger',所以事情可能會出錯。 'self.count'爲0,'otherObject.count'大於'INT_MAX'。只是擡起頭來! :) –

+0

另一個好電話:)豎起大拇指 –

0

不在C中,可能不在Objective-C中。

你可以寫一個函數很輕鬆了,雖然這將是針對特定的操作數類型:

int compare(int x, int y) { 
    return x < y ? -1 : (x > y); 
} 

或者你可以寫一個宏,它可以適用於任何類型的<==,並>運營商,但它有時會評估不止一次它的參數更多:

#define COMPARE(x, y) ((x) < (y) ? -1 : ((x) > (y))) 

(注意,這兩個版本取決於>運營商爲假,1代表真得數爲0)

+0

是啊這兩個選項都是有效的,但我只是看着如何簡化排序選擇器(如問題中提到的),所以馬蒂亞斯的答案真的是現貨 –