如何在循环中中断和 return

How to break and return in a loop

我尝试访问字典数组中的值。 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
}

循环将在第一轮结束后停止。 (它只对 steven 有效,因为他在 lopp 的第一轮。)数组很长,所以我需要在第一场比赛后停止循环。在return之后设置break,因为return所以不会执行。 break后设置return,也是一样的。有什么建议吗?

对于瓦迪安:

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: { [=13=].name == "john" }?.age

    }

}

这个怎么样?不需要内部循环(无论如何都不会循环)。

func getAge() ->Int {
    for item in dataArray {
        if item.firstName == "jana" {
            return item.age
        }
    }

    return 0
}

附带说明一下,字典可能是一种更好的存储数据的方式,可以提高查找效率。

不需要 while 循环或 break 语句。

如果你想迭代循环寻找特定人的年龄,你只需要:

func getAge() -> Int? {
    for items in dataArray {
        if items.name == "jana" {
            return items.age
        }
    }
    return nil
}

请注意更新后的 return 值是可选的。 nil return 值表示找不到此人。不要使用 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")
}