【问题标题】:filter struct objects from object element containing array of string从包含字符串数组的对象元素中过滤结构对象
【发布时间】: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

标签: ios swift


【解决方案1】:

这将返回具有包含“10”的电话号码的任何结构对象

let result = contacts.filter{ $0.phoneNumber.contains(where: { $0.contains("10")}) }

使用您的原始过滤器代码

self.filterContacts = self.contacts.filter {($0.contactName).range(of: textString, options: [ .caseInsensitive, .diacriticInsensitive ]) != nil} + self.contacts.filter { $0.contactNumber.contains(where: {$0.contains(textString)})}

这是我完整的测试代码

struct ECUnifiedStructure{
    var name          : String!
    var phoneNumber   = [String]()
}

let contacts:[ECUnifiedStructure] = [ECUnifiedStructure(name: "David" , phoneNumber : ["1234567890","9876543210"]), 
     ECUnifiedStructure(name: "Hilton" , phoneNumber : ["1011111111","2222222222"]) , 
     ECUnifiedStructure(name: "lewis" , phoneNumber : ["1111111111","2222222222"])]

let result = contacts.filter{ $0.phoneNumber.contains(where: { $0.contains("10")}) }

for r in result {
    print(r)
}

输出

ECUnifiedStructure(name: Optional("David"), phoneNumber: ["1234567890", "9876543210"])
ECUnifiedStructure(name: Optional("Hilton"), phoneNumber: ["1011111111", "2222222222"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2022-08-15
    • 2017-01-28
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多