アドレス帳を作りたいのですが、順番がばらばらで、あいうえお順にソートしたい

投稿者: Anonymous

某S社の本を見ながら、アドレス帳を作っているのですが、並び方があいうえお順ではなく、ばらばらなのでソートをしたいのですが、分かりません。すみませんがどなたかお知恵を拝借できないでしょうか?

Objective-Cの場合は下記方法で名前でソートできていたのですが、

ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 

CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(book); 

CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, 
 CFArrayGetCount(records), records); 

CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCoun(peopleMutable)), 
 (CFComparatorFunction)ABPersonComparePeopleByName,
 (void*)ABPersonGetSortOrdering()); 

同様にswiftで下記のように記述するとエラーが出ます。

var book : ABAddressBook = ABAddressBookCreateWithOptions(nil,nil).takeUnretainedValue() 

let records : NSArray = ABAddressBookCopyArrayOfAllPeople(book).takeUnretainedValue() 

var peopleMutable : CFMutableArray = CFArrayCreateMutableCopy(kCFAllocatorDefault,
 CFArrayGetCount(records), records) 

let loc : CFIndex = 0 

var len : CFIndex = CFArrayGetCount(peopleMutable) 

CFArraySortValues(peopleMutable, CFRangeMake(loc, len), 
 CFComparatorFunction : ABPersonComparePeopleByName , ABPersonGetSortOrdering() ) 

CFArraySortValuesの記述が悪いことは分かっているのですが、どこを直したら良いか分かりません。

どなたかご教授ください。

解決

CFArraySortValuesは関数ポインタを引数に渡す必要があり、Swiftで扱うのは大変なので、NSMutableArraysortUsingComparatorメソッドを使うと簡単です。

例えば、CFArraySortValues以下を次のように書き換えます。

let peopleArray = peopleMutable as NSMutableArray

peopleArray.sortUsingComparator({ (person1, person2) -> NSComparisonResult in
    var result = ABPersonComparePeopleByName(person1, person2, ABPersonGetSortOrdering())
    return NSComparisonResult(rawValue: result.rawValue)!
})
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *