如何在循环中打破并返回

时间:2017-06-17 19:15:05

标签: arrays swift loops return break

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

    }

}

2 个答案:

答案 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")
}