在Objective-C中,我按照以下方式对一系列人进行排序:
CFArraySortValues(mutablePeople,
CFRangeMake(0, CFArrayGetCount(mutablePeople)),
(CFComparatorFunction) ABPersonComparePeopleByName,
kABPersonSortByFirstName)
我正在努力弄清楚如何在Swift中做同样的事情。以下内容:
let ctx = UnsafeMutablePointer<Void>.alloc(kABPersonSortByFirstName)
CFArraySortValues(mutablePeople,
CFRangeMake(0, CFArrayGetCount(mutablePeople)),
ABPersonComparePeopleByName,
ctx)
出现编译错误:
无法使用类型的参数列表调用“CFArraySortValues” '(CFMutableArray!,CFRange,(ABRecord!,ABRecord!, ABPersonSortOrdering) - &gt; CFComparisonResult, UnsafeMutablePointer)'
问题看起来是ABPersonComparePeopleByName
,它将被投射到Objective-C中的CFComparatorFunction
。
答案 0 :(得分:5)
以下是完全避免CFArraySortValues
的两种选择:
使用ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
检索已排序的联系人:
let people = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, ABPersonSortOrdering(kABPersonSortByFirstName)).takeRetainedValue() as [ABRecordRef]
如果您使用nil
作为来源,它会使用所有来源(尽管未记录该行为)。
或者,如果你有一个ABRecordRef
的Swift数组,那么你可以使用标准的Swift排序例程,使用ABPersonComparePeopleByName
进行比较:
var people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as [ABRecordRef]
people.sort() { ABPersonComparePeopleByName($0, $1, ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
这两种方法都返回一个Swift Array<ABRecordRef>
,这是一个很好的原生Swift集合。例如,要打印名称列表:
for record in people {
let name = ABRecordCopyCompositeName(record).takeRetainedValue()
println(name)
}