在Swift中使用CFArraySortValues对联系人排序

时间:2015-05-19 21:33:38

标签: swift abaddressbook

在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

1 个答案:

答案 0 :(得分:5)

以下是完全避免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($0, $1, ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }
    
  3. 这两种方法都返回一个Swift Array<ABRecordRef>,这是一个很好的原生Swift集合。例如,要打印名称列表:

    for record in people {
        let name = ABRecordCopyCompositeName(record).takeRetainedValue()
        println(name)
    }