/ / Swift、abaddressbookを使ったNSPredicate / Swiftフィルタアレイ

NSPredicate - ios、swift、abaddressbookを用いたスウィフトフィルタ配列

私は自分のアドレス帳からユーザーの連絡先に引っ張っているスウィフトで書かれたアプリケーションを持っています。

会社名のみを含む連絡先を除外したい(あなたが「想定した」本人の連絡先を取得し、ビジネスを取得しないようにするため)。

これが私のアプリの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
})

今、これはいくつかの問題を抱えています。 returnステートメントと述語呼び出しの終わりにこれらのエラーが出ます。

エラーメッセージ

SwiftのObjCコードにあるような機能をどのように提供できますか?それとも、連絡先に会社名のみが含まれているかどうかを確認し、それを最後の配列から除外するようにするのがより早い方法です。

ありがとう!

回答:

回答№1は5

firstNameとlastNameがオプションの文字列である場合、それらをnilと比較してそれらをブール式で使用できます。

あなたの2番目のエラーはあなたの閉鎖の後の余分な親によるものです。このコードはうまくいくはずです。

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
}

回答№2のための5

NSArrayをSwift Arrayに変換する場合は、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"]

回答№3の場合は0

Objective-Cの最後の行であなたのテストはなりますfirstNameがnil、またはlastNameがnilの場合にあなたの速いコードでは、あたかもそれらがBoolsであるかのように2つのストリングを比較しようとしています。代わりに、firstNameが存在する場合は戻りたいので、代わりにObjective-CとSwiftの両方のコードでこれを実行する必要があります。

return firstName != nil