gpt4 book ai didi

swift - 在 Swift 中使用 CFArraySortValues 对联系人进行排序

转载 作者:搜寻专家 更新时间:2023-11-01 06:08:44 25 4
gpt4 key购买 nike

在 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($0, $1, ABPersonSortOrdering(kABPersonSortByFirstName)) != .CompareGreaterThan }

这两种方法都返回一个 Swift Array<ABRecordRef> ,这是一个不错的原生 Swift 集合。例如,要打印姓名列表:

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

关于swift - 在 Swift 中使用 CFArraySortValues 对联系人进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com