【问题标题】:Swift - search entire struct for stringSwift - 在整个结构中搜索字符串
【发布时间】:2018-07-22 19:57:19
【问题描述】:

要搜索包含在我使用的结构中的字符串:

let results = myArray.filter( {$0.model.localizedCaseInsensitiveContains("bu")} )

但是假设该结构有几个我想搜索的属性 - 或者我什至想一次搜索所有这些属性。我只能过滤原始类型,因此将“模型”排除在外是行不通的。

解决办法-------------

虽然我真的很喜欢下面 Matt 建议的使用键路径的想法,但我最终在我的结构中添加了一个函数,使我的视图控制器代码更加简洁:

struct QuoteItem {

    var itemIdentifier: UUID
    var quoteNumber: String
    var customerName: String
    var address1: String

    func quoteItemContains(_ searchString: String) -> Bool {
        if self.address1.localizedCaseInsensitiveContains(searchString) ||
        self.customerName.localizedCaseInsensitiveContains(searchString) ||
        self.quoteNumber.localizedCaseInsensitiveContains(searchString)
        {
            return true
        }
        return false
    }

然后,在我的控制器中,quotes 是一个 QuoteItem 数组,我可以通过简单地编写来搜索:

searchQuoteArray = quotes.filter({ $0.quoteItemContains(searchString) })

【问题讨论】:

标签: swift struct filter


【解决方案1】:

这听起来像是 Swift 的工作关键路径。只需提供要搜索的字符串属性的关键路径即可。

struct MyStruct {
    let manny = "Hi"
    let moe = "Hey"
    let jack = "Howdy"
}

let paths = [\MyStruct.manny, \MyStruct.moe, \MyStruct.jack]
let s = MyStruct()
let target = "y"
let results = paths.map { s[keyPath:$0].localizedCaseInsensitiveContains(target) }
// [false, true, true]

【讨论】:

    【解决方案2】:

    我希望我理解你是正确的。我认为通过这段代码你可以实现你想要的:

    struct ExampleStruct {
        let firstSearchString: String
        let secondSearchString: String
    }
    
    let exampleOne = ExampleStruct(firstSearchString: "Hello", secondSearchString: "Dude")
    let exampleTwo = ExampleStruct(firstSearchString: "Bye", secondSearchString: "Boy")
    
    let exampleArray = [exampleOne, exampleTwo]
    
    let searchString = "Hello"
    
    let filteredArray = exampleArray.filter { (example) -> Bool in
    
        // check here the properties you want to check
        if (example.firstSearchString.localizedCaseInsensitiveContains(searchString) || example.secondSearchString.localizedCaseInsensitiveContains(searchString)) {
            return true
        }
        return false
    }
    
    for example in filteredArray {
        print(example)
    }
    

    这会在 Playgrounds 中打印以下内容:

    ExampleStruct(firstSearchString: "Hello", secondSearchString: "Dude")
    

    如果有帮助,请告诉我。

    【讨论】:

    • 我的结构中有十个属性要搜索,所以我认为上面的示例会很快重复。但我感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2015-05-12
    • 2018-07-25
    相关资源
    最近更新 更多