iOS - NSSort​Descriptor

weixin_34050427發表於2019-01-02

排序是電腦科學中不能避免的問題,很幸運看到了一篇關於排序的NSSort​Descriptor類的文件。文件地址
NSSort​Descriptor是一個用來描述如何排序一個物件集合的描述符,基於這些物件的共同屬性。

概述

你可以建立一個NSSort​Descriptor的例項,通過指定要用來比較和進行排序(升序或者降序)的屬性的鍵。你可以指定一個方法來實現比較,你也能使用其他排序方法例如localizedStandardCompare:localizedCaseInsensitiveCompare:。排序丟擲異常如果被排序的物件沒有答覆(respond)排序描述符實現比較的方法。
下面是你可以使用排序描述符做的事情:

宣告

// 通過指定key和排序方式建立並返回一個排序描述符。
+ (instancetype)sortDescriptorWithKey:(NSString *)key 
                                      ascending:(BOOL)ascending;  
// 通過指定key和排序方式初始化一個排序描述符。
- (instancetype)initWithKey:(NSString *)key 
                            ascending:(BOOL)ascending;  
 // 通過指定key、排序方式和排序方法建立並返回一個排序描述符。
+ (instancetype)sortDescriptorWithKey:(NSString *)key 
                                      ascending:(BOOL)ascending 
                                      selector:(SEL)selector; 
// 通過指定key、排序方式和排序方法初始化一個排序描述符。
- (instancetype)initWithKey:(NSString *)key 
                            ascending:(BOOL)ascending 
                            selector:(SEL)selector;  
//  通過指定key、排序方式和排序閉包建立並返回一個排序描述符。
+ (instancetype)sortDescriptorWithKey:(NSString *)key 
                                      ascending:(BOOL)ascending 
                                      comparator:(NSComparator)cmptr;  
// 通過指定key、排序方式和排序閉包初始化一個排序描述符。
- (instancetype)initWithKey:(NSString *)key 
                            ascending:(BOOL)ascending 
                            comparator:(NSComparator)cmptr;  

初始化方法中相關引數

ascending:指明是否升序排序的布林值。
key:指明在排序是進行比較的屬性。
selector:比較時使用的方法。
comparator:排序描述符的比較閉包。

使用排序描述符

// 返回兩個物件排序順序結果
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2;
// 返回一個逆序的排序描述符
@property(readonly, retain) id reversedSortDescriptor;
// 強制一個被安全解碼(遵守`NSSecureCoding`協議)的排序描述符允許進行賦值
- (void)allowEvaluation;
關於這個方法的討論:當遵守NSSecureCoding協議的排序描述符正在被安全的解碼時,賦值是不被允許的。因為解檔出來的物件可能有潛在的風險。
所以在允許賦值之前,應該合適keypaths、selectors、相關屬性,避免可能有錯誤的、惡意的程式碼被執行。可以呼叫`allowEvaluation`方法來允許賦值。

相關文章