ios - 使用 NSPredicate 的 Swift 过滤器数组

标签 ios swift abaddressbook

我有一个用 Swift 编写的应用程序,它从用户的地址簿中提取联系人。

我想过滤掉仅包含公司名称的联系人(以便您获得“假定的”真人联系人而不是企业)

这是在我的应用程序的 Objective-C 版本中如何完成的:

NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) {
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty));
    NSString *lastName  = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonLastNameProperty));

    return (firstName || lastName);
}];

NSArray *peopleNotCompanies = [allContacts filteredArrayUsingPredicate:predicate];

这非常有效,所以这是我在 Swift 中的尝试:

var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()

var predicate: NSPredicate = NSPredicate { (AnyObject person, NSDictionary bindings) -> Bool in
    var firstName: String = ABRecordCopyValue(person as ABRecordRef, kABPersonFirstNameProperty).takeRetainedValue() as String
    var lastName: String = ABRecordCopyValue(person as ABRecordRef, kABPersonLastNameProperty).takeRetainedValue() as String

    return firstName || lastName
})

现在这有几个问题。我在返回语句和谓词调用结束时收到这些错误:

Error Messages

如何在 Swift 中提供在我的 ObjC 代码中找到的类似功能?或者有没有更好的方法快速检查联系人是否只有公司名称,然后从最终数组中省略它?

谢谢!

最佳答案

如果 firstName 和 lastName 是可选字符串,则可以将它们与 nil 进行比较,并在 bool 表达式中使用它们。

您的第二个错误是由于关闭后的额外括号。这段代码应该可以工作。

var predicate: NSPredicate = NSPredicate { (AnyObject person, NSDictionary bindings) -> Bool in
    var firstName: String? = ABRecordCopyValue(person as ABRecordRef, kABPersonFirstNameProperty).takeRetainedValue() as? String
    var lastName: String? = ABRecordCopyValue(person as ABRecordRef, kABPersonLastNameProperty).takeRetainedValue() as? String

    return firstName != nil || lastName != nil
}

关于ios - 使用 NSPredicate 的 Swift 过滤器数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715780/

相关文章:

ios - 如何使用 ios-charts 制作分组条形图?

ios - 将时间戳从 Firebase 转换为 Time Ago

ios - UIBarButtonItem 不出现

iOS 临时文件夹位置

swift - 找到一个数的所有因子的最有效方法?

iphone - 如何获取 iPhone 地址簿联系人电子邮件作为 NSStrings?

ios - 使用 UISearchController 无法正确运行搜索

ios - 如何使 SFSpeechRecongnizer 可重用于每个 UIViewControllers

ios - 为什么 ABGroupAddMember 失败?它返回 NO 并且不设置 CFErrorRef 值

ios - ABAddressBookCreateWithOptions 导致崩溃(无法识别的选择器)