在 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 的备选方案:

  1. 使用ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering检索已排序的联系人:

    let people = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, ABPersonSortOrdering(kABPersonSortByFirstName)).takeRetainedValue() as [ABRecordRef]
    

    如果您使用 nil 作为来源,它会使用所有来源(尽管未记录该行为)。

  2. 或者,如果您有 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)
}