Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swift中的CFArraySortValues对联系人进行排序_Swift_Abaddressbook - Fatal编程技术网

使用Swift中的CFArraySortValues对联系人进行排序

使用Swift中的CFArraySortValues对联系人进行排序,swift,abaddressbook,Swift,Abaddressbook,在Objective-C中,我将对一系列人员进行如下排序: CFArraySortValues(mutablePeople, CFRangeMake(0, CFArrayGetCount(mutablePeople)), (CFComparatorFunction) ABPersonComparePeopleByName, kABPersonSortByFirstName) 我正在努力想

在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)
让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
    ,它将使用所有源代码(尽管该行为没有文档记录)

  • 或者,如果您有一个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)
    }
    

    以下是两种可避免
    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)
    }