swift 联系人框架,带有 namePrefix 而不是名称的谓词

swift contacts framework, predicate with namePrefix rather than a name

我正在尝试获取显示特定 'namePrefix'(例如先生、夫人或小姐等)的所有联系人的列表。然而,碰壁了。

我将以下代码与 Predicate 结合使用来获取名称搜索的结果,这很好...

let store = CNContactStore()
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactNamePrefixKey, CNContactPhoneNumbersKey]

    // Predicate = prob...? How get namePrefix
    let predicate = CNContact.predicateForContactsMatchingName("James")

    do {
        let fetchedContacts = try store.unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)

        for result in fetchedContacts {
            print("\(result.givenName) \(result.familyName) \(result.phoneNumbers) \(result.namePrefix)")
        }
    } catch {
        print("Error unable to fetch")
    }

不过,我需要"namePrefix"。 Apple 文档显示 namePrefix 可作为 属性 使用,但经过反复试验,无法找到使用它来过滤我的 'predicate' 结果的方法。 我认为可能有可能使用... "predicateForContactsWithIdentifiers" 但无法找到示例。

我想知道 namePrefix 过滤器是否可以通过上面的谓词行以某种方式完成?或者,如果不能,是否可以用 "predicateForContactsWithIdentifiers"?

来完成

我了解 Apple 不允许对...以外的谓词进行自定义

predicateForContactsMatchingName // predicateForContactsInContainerWithIdentifier predicateForContactsWithIdentifiers // predicateForContactsInGroupWithIdentifier

但是,如果直接根目录不可用,我正在寻找解决方法...?

非常感谢。

获取所有 联系人后,您可以再使用一个谓词:

let prefixPredicate = NSPredicate(format: "namePrefix = 'smth'")
let searchedByPrefix = (fetchedContacts as NSArray)
print(searchedByPrefix.filteredArrayUsingPredicate(prefixPredicate))

其中 'smth' 是您要查找的字符串值。

如果您正在寻找使用联系人框架的直接方式,那么在我看来没有这样的解决方案。

@T。 Pasichnyk - 感谢您对 'Fetching all Contacts' 1st 的想法。 我使用这个然后使用以下代码来过滤 namePrefix 以提供个人名称和使用次数。

var counterForPrefix = Int()

    do {
        let results = try CNContactStore().unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)

        if results.isEmpty {
            print("nothing in Contacts")

        } else {

            for result in results {

                if result.namePrefix == "S." {
                    print(result.givenName)
                    counterForPrefix += 1
                }
            }
            print(counterForPrefix)
        }
    } catch {
    }