2015-05-19 6 views
1

В Objective-C, я бы отсортировать массив людей следующим образом:Сортировка контактов с CFArraySortValues ​​в Swift

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, который будет приведен к CFComparatorFunction в Objective-C.

ответ

5

Здесь два варианта, которые избегают CFArraySortValues в целом:

  1. Использование ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering для извлечения контактов уже отсортированные:

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

    Если вы используете nil для источника, он использует все источники (хотя это поведение не задокументировано).

  2. С другой стороны, если у вас есть Swift массив ABRecordRef, вы можете использовать стандартный 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) 
} 
+0

Два отличных ответа, только то, что мне было нужно, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^