2011-06-27 43 views
1

方法我看到這個帖子:How to sort an NSMutableArray of objects by a member of its class, that is an int or float寫作比較:在Objective-C

與此前類似的東西,但我不知道它是如何工作,並希望一些指導。我有一個標記對象的數組,它有一個類型伊娃,取值爲0,1,2。我想要一個複選框,說什麼命令,0,1或2.

我開始關閉的試圖做類似的事情在我自己的方法:

- (NSComparisonResult)Type:(id)otherObject { 
    if ([self Type] > [otherObject Type]) { 
     return NSOrderedAscending; 
    } 
    else if ([self Type] < [otherObject Type]) { 
     return NSOrderedDescending; 
    } 
    else { 
     return NSOrderedSame; 
    } 
} 

在我的.h文件:

NSInteger _type; 
@property NSInteger Type; 

我得到了兩個警告:指針和整型(「身份證」之間 有序比較NSInteger') 方法 - 未找到類型(返回類型默認爲'id')

我不明白當你調用sort方法時發生了什麼。謝謝。

+0

爲了查看下面的答案是否在正確的軌道上,查看您的頭文件可能會有所幫助,其中定義了類型。 – deftangel

回答

5

如果您明確輸入類型是YourObjectType *(或任何您的對象稱爲)而不是id,會發生什麼情況?爲了完全安全,您應該檢查傳入對象的類型(因爲它可能根本不會響應「類型」,或者可能會使用相同的選擇器返回其他內容),因此您最終得到:

- (NSComparisonResult)Type:(YourObjectType *)otherObject { 
    if(![otherObject isKindOfClass:[YourObjectType class]]) return NSOrderedSame; 

    if ([self Type] > [otherObject Type]) { 
     return NSOrderedAscending; 
    } 
    else if ([self Type] < [otherObject Type]) { 
     return NSOrderedDescending; 
    } 
    else { 
     return NSOrderedSame; 
    } 
} 

我基本上做出了與高度飲用咖啡因相同的猜測,即編譯器無法正確確定'Type'的返回類型,但我的猜測是,這是因爲對傳入對象的編譯器預測不正確。

要解釋的全過程:

當你問到的NSArray sortUsingSelector,它會施加一定的排序算法需要它能夠在其中任意兩個比較對象。當它需要比較兩個對象時,它會發送您提供的選擇器,然後使用您返回的結果 - 所以在升序/降序中,您指定了如果正確排序,兩個對象將出現的順序。例如,如果您有一個填充了SillyObjectType類型的對象的NSArray,並且您發出了sortUsingSelector:@selector(compare:),則NSArray會應用一些未指定的排序算法,其中包括將選擇器compare:發送到SillyObjectType的實例。每個SillyObjectType都會被問到:「你應該來到這個其他對象之前,之後還是同一個地方?」。它用NSOrderedAscending,Descending或Same來回答。

這是ObjC的動態調度給出的東西稍微不同於書中所用的方式的地方。 C++。選擇器將被髮送到數組中的對象,所以您應該在這些對象上實現它。在每種情況下都適用正常規則,所以self將是該類的那個實例。

+0

所以我再看看它,我認爲我做錯了什麼是不明白究竟發生了什麼。所以在我的類是一個彈出控制器,我做了[自我類型],我得到相同的警告,並沒有輸出,當我嘗試NSLog它。但是,如果我創建了Marker對象,並且設置了Type變量,並且執行了self.Type,那麼當我對其進行NSLog處理時,就會得到一個輸出結果。在上面的NSComparisonResult方法中,self是我用來調用此方法的Marker對象的數組嗎?你也可以解釋在方法的第一部分中返回NSOrderedAscending與NSOrderedDescending的邏輯嗎?謝謝。 – Crystal

+0

我的回答有點太長,不適合作爲評論;我已經修改了上面的完整答案。 – Tommy

+0

好吧,這很有道理。我仍然有使用[self Type]的問題。第一個警告與以前相同,第二個警告:未找到Method'-Type'(返回類型默認爲'id')。這是因爲我在ViewController類嗎?我認爲自我指的是調用它的對象,在我的情況下,是一個標記數組,它有一個名爲Type的屬性,我試圖比較它。當我嘗試運行它時,它在[self.Markers sortUsingSelector:@selector(compareType :)]調用上崩潰。任何其他想法?謝謝。 – Crystal

0

看起來您已將Type定義爲ivar而不是屬性,因此它在otherObject中將不可見。公開它作爲一個財產,你的比較應該工作。

+0

它在我的.h中聲明爲屬性。還是它宣佈不正確?謝謝。 – Crystal

+0

你在.m中有相應的@synthesize聲明嗎? – highlycaffeinated

+0

是的,@synthesize Type = _type ;. – Crystal