在 Swift 中使用 CFArraySortValues 对联系人进行排序
Sort contacts with CFArraySortValues in Swift
在 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)
给出编译错误:
Cannot invoke 'CFArraySortValues' with an argument list of type
'(CFMutableArray!, CFRange, (ABRecord!, ABRecord!,
ABPersonSortOrdering) -> CFComparisonResult,
UnsafeMutablePointer)'
问题似乎出在 ABPersonComparePeopleByName
上,它将被转换为 Objective-C 中的 CFComparatorFunction
。
这里有两个完全避免 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([=11=], , ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
这两种方法 return Swift Array<ABRecordRef>
,这是一个很好的本地 Swift 集合。例如,要打印姓名列表:
for record in people {
let name = ABRecordCopyCompositeName(record).takeRetainedValue()
println(name)
}
在 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)
给出编译错误:
Cannot invoke 'CFArraySortValues' with an argument list of type '(CFMutableArray!, CFRange, (ABRecord!, ABRecord!, ABPersonSortOrdering) -> CFComparisonResult, UnsafeMutablePointer)'
问题似乎出在 ABPersonComparePeopleByName
上,它将被转换为 Objective-C 中的 CFComparatorFunction
。
这里有两个完全避免 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([=11=], , ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
这两种方法 return Swift Array<ABRecordRef>
,这是一个很好的本地 Swift 集合。例如,要打印姓名列表:
for record in people {
let name = ABRecordCopyCompositeName(record).takeRetainedValue()
println(name)
}