我有一个对象数组,我正在尝试按该对象的几个属性进行过滤。下面是一个简化的对象和循环,可满足我的需求。
但是我没有名字列表,但是当我这样做时,即使我正在检查以确保此人是数组中的最后一个人,在末尾也会得到一个额外的“,”。
struct Person: Equatable {
var name: String
var gender: String
var age: Int
var address: String
}
var personArray: [Person] = [Person]()
personArray.append(Person(name: "Pedro", gender: "M", age: 23, address: "1 Lane Drive"))
personArray.append(Person(name: "Juan", gender: "M", age: 18, address: "1 Lane Drive"))
personArray.append(Person(name: "Mary", gender: "F", age: 13, address: "1 Lane Drive"))
personArray.append(Person(name: "Carlos", gender: "M", age: 21, address: "1 Lane Drive"))
personArray.append(Person(name: "Jesus", gender: "M", age: 15, address: "1 Lane Drive"))
personArray.append(Person(name: "Jaque", gender: "F", age: 35, address: "1 Lane Drive"))
var minors = ""
for person in personArray {
if person.age < 18 && person.gender == "f" {
minors.append(person.name)
if person != personArray.last {
minors.append(", ")
}
}
}
// if there are female minors, print list of minors
print(minors)
我需要的是能够获得所有未成年人的名单,或者如果适用的话,没有名单。
答案 0 :(得分:3)
您可以通过更加快速地简化它:
let minors = personArray.filter({$0.age < 18 && $0.gender == "F"}).map({$0.name}).joined(separator: ", ")
if minors.isEmpty {
print("There are no minors")
} else {
print("List of minors: \(minors)")
}
您遇到的第一个问题是您有错字。您的性别设置为“ F”,但在循环中,您正在检查“ f”。
仅基于上述信息,我不确定您的结构上是否需要“ Equatable”。与last的比较不起作用的原因是,您检查人员是否等于数组中的最后一个对象,但是在这种情况下,数组中的最后一个对象不符合您的要求。