2017-03-10 2 views
2

私はこのような大文字と小文字を区別しない文字列のソート記述子を作成することができます。 コンパイラーシグニチャーを使用してNSSortDescriptorを作成する方法は?

class NSSortDescriptor { 
    init(key: String?, ascending: Bool, comparator cmptr: @escaping Foundation.Comparator) 
    ... 
} 

は私が持っていますか:

let titleSort = NSSortDescriptor(key: "title", ascending: true, 
            selector: #selector(NSString.localizedCaseInsensitiveCompare)) 

私はcomparator署名を使用してそれを行う方法を見つけ出すように見えることはできませんゼロから新しいコンパレータを作成するか、Stringのために既に何かが存在しますか?

TIA

+1

あなたは(、どれを) 'あなた自身を渡すことがあります。もちろん、あなたはあなたがソートする必要が予想されるものに基づいて必要があるとして、複合体として、これを行うことができます。 –

+0

ありがとう@MartinR。この目的のために利用可能なグローバル関数があるかどうかはわかりませんでした。 – RobertJoseph

答えて

1

例:

class C : NSObject { 
    var id = 0 
} 

let desc = NSSortDescriptor(key: "id", ascending: true) { // comparator function 
    id1, id2 in 
    if (id1 as! Int) < (id2 as! Int) { return .orderedAscending } 
    if (id1 as! Int) > (id2 as! Int) { return .orderedDescending } 
    return .orderedSame 
} 

// test: 

let c1 = C(); let c2 = C(); let c3 = C() 
c1.id = 100; c2.id = 50; c3.id = 25 
let arr = [c1,c2,c3] 
let arr2 = (arr as NSArray).sortedArray(using: [desc]) 
+0

さて、最初の試みが間違っていたのは残念です。 – matt

4

コンパレータが内蔵されていない比較を行うことを意図しているとして、このための世界的な機能はありません。 2つの異なるタイプのオブジェクトを比較し、どのようにソートするかを正確に定義することができるので、柔軟性に優れています。これらをどのように並べ替えるかについての非常に簡単なデモンストレーションで、私は最初に両方のオブジェクトがStringであるかどうかを確認する例を作成し、そうでなければ同じレベルで注文する必要があるかのように扱います。それ以外の場合は、アルファベット順にソートします(大文字小文字を区別しないので、小文字にします)。 - > ComparisonResult`閉鎖

let descriptor = NSSortDescriptor(key: "title", ascending: true) { (string1, string2) -> ComparisonResult in 
     guard let s1 = string1 as? String, let s2 = string2 as? String else { 
      return ComparisonResult.orderedSame 
     } 
     if s1.lowercased() < s2.lowercased() { 
      return ComparisonResult.orderedAscending 
     } else if s1.lowercased() == s2.lowercased() { 
      return ComparisonResult.orderedSame 
     } else { 
      return ComparisonResult.orderedDescending 
     } 
    } 
関連する問題