简体   繁体   English

快速过滤多维数组

[英]Filtering a multi-dimensional array in swift

I am trying to filter a multi-dimensional array.我正在尝试过滤多维数组。 Below is my swiftUI view.下面是我的 swiftUI 视图。

import SwiftUI

struct Person {
    let name: String
    let job: String
    let age: Int
    let rating: Rating
    enum Rating: String {
        case Poor, Ok, Good, Excellent
    }
}


extension Person: CustomStringConvertible {
    var description: String {
        "Name: \(name), Job: \(job), Age: \(age), Rating: \(rating)"
    }
}

struct view: View {
    
    let name = "Paul"
    var array2d: [[String]].map(Person.init)
    let person = array2d.first(where: {$0.name == name})
    
    var body: some View {
        
        ZStack{
        Color.white
            Text("\(self.person)")
            
        }
            
        
    }
    
}

array2d is passed from the ViewController to the swiftUI view and it looks like this: array2d 从 ViewController 传递到 swiftUI 视图,它看起来像这样:

var array2d = [[Paul, CEO, 30, Good], [John, Manager, 45, Ok], [Scott, Assistant, 22, Poor], [Robert, CEO, 67, Excellent], [Paul, CEO, 56, Poor], [John, Manager, 23, Good]]

I am getting several errors with the the above code:上面的代码出现了几个错误:

on var array2d: [[String]].map(Person.init) the errors:在 var array2d: [[String]].map(Person.init) 上的错误:

Consecutive declarations on a line must be separated by ';'
Expected declaration

and on let person = array2d.first(where: {$0.name == name})然后让 person = array2d.first(where: {$0.name == name})

Cannot use instance member 'array2d' within property initializer; property initializers run before 'self' is available

Cannot use instance member 'name' within property initializer; property initializers run before 'self' is available

Value of type '[String]' has no member 'name'

A direct answer to your question you can get the first array where the first element is equal to person:直接回答您的问题,您可以获得第一个元素等于 person 的第一个数组:

let person = "Paul"
let array2d = [["Paul", "CEO", "30", "Good"], ["John", "Manager", "45", "Ok"], ["Scott", "Assistant", "22", "Poor"], ["Robert", "CEO", "67", "Excellent"], ["Paul", "CEO", "56", "Poor"], ["John", "Manager", "23", "Good"]]
if let array = array2d.first(where: {$0.first == person}) {
    print(array)  // ["Paul", "CEO", "30", "Good"]
}

But what you really should do is to struct your data and search your array by its name property:但是你真正应该做的是构造你的数据并通过它的 name 属性搜索你的数组:

struct Person {
    let name: String
    let job: String
    let age: Int
    let rating: Rating
    enum Rating: String {
        case poor, regular, good, excellent
    }
}

extension Person: CustomStringConvertible {
    var description: String {
        "Name: \(name), Job: \(job), Age: \(age), Rating: \(rating)"
    }
}

let name = "Paul"
let people = [("Paul", "CEO", 30, .good), ("John", "Manager", 45, .regular), ("Scott", "Assistant", 22, .poor), ("Robert", "CEO", 67, .excellent), ("Paul", "CEO", 56, .poor), ("John", "Manager", 23, .good)].map(Person.init)
if let person = people.first(where: {$0.name == name}) {
    print(person)  // "Name: Paul, Job: CEO, Age: 30, Rating: good\n"
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM