我尝试访问字典数组中的值。 dataArray看起来像这样:
struct Person {
let name: String
let lastName: String
let age: Int
}
let person1: Person = Person(name: "Steven", lastName: "miller", age: 23)
let person2: Person = Person(name: "jana", lastName: "drexler", age: 31)
let person3: Person = Person(name: "hanna", lastName: "montana", age: 56)
var dataArray = [Person]()
dataArray.append(person1)
dataArray.append(person2)
dataArray.append(person3)
现在我想进入jana的时代。如果我这样做:
func getAge() ->Int {
var age: Int = 0
for items in dataArray {
while items.name == "jana" {
age = items.age
return age
break // This break will never be executed because of return.
}
break // setting the break here, the loop will break after first round
}
return age
}
循环将在第一轮后停止。 (它只适用于史蒂文,因为他处于lopp的第一轮。)阵列很长,所以我需要在第一场比赛后停止循环。返回后设置中断,因返回而不会执行。在休息后设置返回,它是相同的。有什么建议吗?
对于vadian:
class AGE {
func getAge() -> Int? {
dataArray.append(person1)
dataArray.append(person2)
dataArray.append(person3)
// Cannot call value of non-function type `Person`
return dataArray.first(where: { $0.name == "john" }?.age
}
}
答案 0 :(得分:1)
这个怎么样?不需要内循环(无论如何都不会循环)。
func getAge() ->Int {
for item in dataArray {
if item.firstName == "jana" {
return item.age
}
}
return 0
}
作为旁注,字典可能是存储数据以使查找更有效的更好方法。
答案 1 :(得分:0)
不需要while
循环或break
语句。
如果你想循环寻找特定人的年龄,你只需要:
func getAge() -> Int? {
for items in dataArray {
if items.name == "jana" {
return items.age
}
}
return nil
}
请注意更新的返回值是可选的。 nil
返回值表示找不到此人。不要将0
用作魔术值。
对名称进行硬编码也很糟糕。将其作为参数传递。并使用更好的变量名称:
func getAge(of name: String) -> Int? {
for person in dataArray {
if person.name == name {
return person.age
}
}
return nil
}
if let age = getAge(of: "jana") {
print("age is \(age)")
} else {
print("Name not found")
}