[英]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.