使用Swift中的CFArraySortValues对联系人进行排序
在Objective-C中,我将对一系列人员进行如下排序:使用Swift中的CFArraySortValues对联系人进行排序,swift,abaddressbook,Swift,Abaddressbook,在Objective-C中,我将对一系列人员进行如下排序: CFArraySortValues(mutablePeople, CFRangeMake(0, CFArrayGetCount(mutablePeople)), (CFComparatorFunction) ABPersonComparePeopleByName, kABPersonSortByFirstName) 我正在努力想
CFArraySortValues(mutablePeople,
CFRangeMake(0, CFArrayGetCount(mutablePeople)),
(CFComparatorFunction) ABPersonComparePeopleByName,
kABPersonSortByFirstName)
我正在努力想办法在Swift中也能做到这一点。以下是:
let ctx = UnsafeMutablePointer<Void>.alloc(kABPersonSortByFirstName)
CFArraySortValues(mutablePeople,
CFRangeMake(0, CFArrayGetCount(mutablePeople)),
ABPersonComparePeopleByName,
ctx)
让ctx=UnsafeMutablePointer.alloc(kABPersonSortByFirstName)
CFArraySortValues(可变人员,
CFRangeMake(0,CFArrayGetCount(可变人员)),
ABPersonCompareOpleByName,
ctx)
给出编译错误:
无法使用类型为的参数列表调用“CFArraySortValues”
'(CFMutableArray!,CFRange,(ABRecord!,ABRecord!,
ABPersonSortOrdering)->cfc比较结果,
不可女性化指针)'
问题似乎出在Objective-C中的
ABPersonCompareOpleByName
将被转换为CFComparatorFunction
。这里有两个选择,它们可以避免CFArraySortValues
:
abAddressBookCopyArrayFallPeopleInSourceWithSortOrdering
检索已排序的联系人:
let people = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, ABPersonSortOrdering(kABPersonSortByFirstName)).takeRetainedValue() as [ABRecordRef]
如果对源代码使用nil
,它将使用所有源代码(尽管该行为没有文档记录)ABRecordRef
,则可以使用标准Swift排序例程,使用abpersoncompareportebyname
进行比较:
var people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as [ABRecordRef]
people.sort() { ABPersonComparePeopleByName($0, $1, ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
数组,这是一个很好的本机Swift集合。例如,要打印姓名列表,请执行以下操作:
for record in people {
let name = ABRecordCopyCompositeName(record).takeRetainedValue()
println(name)
}
以下是两种可避免CFArraySortValues
的方法:
使用abAddressBookCopyArrayFallPeopleInSourceWithSortOrdering
检索已排序的联系人:
let people = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, ABPersonSortOrdering(kABPersonSortByFirstName)).takeRetainedValue() as [ABRecordRef]
如果对源代码使用nil
,它将使用所有源代码(尽管该行为没有文档记录)
或者,如果您有一个Swift数组ABRecordRef
,则可以使用标准Swift排序例程,使用abpersoncompareportebyname
进行比较:
var people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as [ABRecordRef]
people.sort() { ABPersonComparePeopleByName($0, $1, ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
这两种方法都返回一个Swift数组,这是一个很好的本机Swift集合。例如,要打印姓名列表,请执行以下操作:
for record in people {
let name = ABRecordCopyCompositeName(record).takeRetainedValue()
println(name)
}