Swift 如何在数组中过滤数组

Swift How to filter an array within an array

我有一个数组定义为:

var MyArrayOfPaintings = [Painting]()

其中绘画定义为:

struct Painting{
    let Artist: String
    let Name: String
    let ThumbNailURL: String
    var PaintsUsed: [Paint]
}

并且 Paint 定义为:

struct Paint{
    var PaintType: String
    var PaintColorName: String
}

通常情况下,如果我想根据搜索栏中的名称 属性 过滤此数组,我只需添加一行:

FilteredArray = MyArrayOfPaintings.filter({[=14=].Name.lowercased().contains(searchText.lowercased())})

这很好用,但现在在我的搜索栏中,我还希望能够搜索然后过滤 MyArray,其中 PaintColorName 是搜索值。

我如何根据提供的 PaintColourName 过滤 MyArrayOfPaintings 您实际上如何根据其中的结构数组过滤数组?

与您的问题无关,但您可以使用 localizedCaseInsensitiveContains 而不是小写名称和搜索文本。关于你的问题,你可以过滤包含颜色名称的颜料。

struct Painting {
    let artist: String
    let name: String
    let thumbNailURL: String
    var paints: [Paint]
}

struct Paint {
    var type: String
    var colorName: String
}

var paintings: [Painting] = [.init(artist: "Artist A", name: "Name A", thumbNailURL: "url1", paints: [.init(type: "a", colorName: "white"), .init(type: "b", colorName: "black")]),
                             .init(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [.init(type: "c", colorName: "red"), .init(type: "d", colorName: "green")])]

let searchText = "green"
let filtered = paintings.filter { [=13=].paints.contains {[=13=].colorName.localizedCaseInsensitiveContains(searchText) } }

print(filtered) // [Painting(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [Paint(type: "c", colorName: "red"), Paint(type: "d", colorName: "green")])]

如果你只想得到油漆,你可以使用 flatMap 而不是过滤器,然后使用过滤器而不是包含:

let paints = paintings.flatMap { [=14=].paints.filter {[=14=].colorName.localizedCaseInsensitiveContains(searchText) } }

paints  // [{type "d", colorName "green"}]