【发布时间】:2019-07-29 03:19:47
【问题描述】:
我定义了一个结构如下:
struct ECUnifiedStructure{
var contactName : String!
var contactNumber = [String]()
...
...
init(contact: CNContact , EProfile : Bool) {
let validTypes = [
CNLabelPhoneNumberiPhone,
CNLabelPhoneNumberMobile,
CNLabelPhoneNumberMain,
CNLabelHome,
CNLabelWork
]
var givenName = contact.givenName + " " + contact.middleName
let familyName = contact.familyName
if (givenName == "" && familyName == "") || givenName == " "{
givenName = contact.organizationName
}
self.contactName = givenName.capitalized + familyName.capitalized
self.contactNumber = contact.phoneNumbers.compactMap({ (PhoneNumber) -> String? in
if let phoneLabel = PhoneNumber.label , validTypes.contains(phoneLabel){
return PhoneNumber.value.stringValue.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "-", with: "")
}
return nil
})
....
....
....
}}
问题说明:需要根据姓名和电话号码过滤一个ECUnifiedStructure数组(即.[ECUnifiedStructure])(检查子串和整个字符串)。
当前实施:以下是我目前所做的实施。这里的触点和过滤器触点都是 [ECUnifiedStructure]。
self.filterContacts = self.contacts.filter {($0.contactName).range(of: textString, options: [ .caseInsensitive, .diacriticInsensitive ]) != nil} + self.contacts.filter {($0.contactNumber.compactMap {$0}.contains(textString))}
实施问题: 获得按预期过滤联系人姓名的结果,结果包括整个字符串和子字符串,但
过滤电话号码时,未找到子字符串的结果 。只有当我们给出完整的电话号码时,结果才会出现。
可能的原因:
self.contacts.filter {($0.contactNumber.compactMap {$0}.contains(textString))}
例如:假设联系人 = [[姓名:“大卫”,电话号码: ["1234567890",9876543210]],[姓名:"希尔顿",电话号码: [“1011111111”,“2222222222”]],[姓名:“刘易斯”,电话号码: ["1111111111","2222222222"]]]
searchString = "10"
预期结果 = [[name: "David" , phoneNumber : ["1234567890",9876543210]],[姓名:"希尔顿",电话号码: ["1011111111","2222222222"]]]
当前结果 = 空。
请提出一种优雅的方法。如果你能指出我做错了什么。提前致谢。
【问题讨论】:
-
是的,我试过了。 @ArashEtemad