使用NSPredicate的Swift过滤器数组

Kyl*_*man 6 abaddressbook ios swift

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

我想过滤掉只包含公司名称的联系人(这样你就可以得到"假定的"真人联系而不是商家)

以下是我在app的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];
Run Code Online (Sandbox Code Playgroud)

这很好用,所以这是我尝试在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
})
Run Code Online (Sandbox Code Playgroud)

现在这有两个问题.我在return语句和谓词调用结束时收到这些错误:

错误消息

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

谢谢!

Con*_*nor 5

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

你的第二个错误是由于关闭后额外的paren.这段代码应该有效.

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
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果将NSArray转换为Swift数组,则可以使用Swift的Array.filter方法.为清晰起见,这是一个简单对象的示例:

let arrObjc: NSArray = ["aaa", "bab", "bbb", "baa", "cbc"]
let arr: [AnyObject] = arrObjc //create a swift array with same data

// filter takes a block that returns a boolean. True: keep the item, False: drop it.
arr.filter{
  if let s = $0 as? String {  // first try to cast AnyObject to our expected type.
    return contains(s, "a")   // return true if we want this item, false otherwise.
  } else {
    return false              // this object is of the wrong type, return false.
  }
}

// returns: ["aaa", "bab", "baa"]
Run Code Online (Sandbox Code Playgroud)