我承认我有点傻,但经过几个小时的尝试我不得不问:
class AGE {
static func getAge() -> Int {
var age: Int
for items in dataArray {
if items.name == "Steven" {
age = items.age
}
else {
age = 0
}
}
// variable "age" used before being initialized - WHY?
return age
}
}
我什至尝试在开始时设置 var age: Int = 0
,但随后函数 return 0
。我希望此时有人能原谅我这个基本问题。任何帮助表示赞赏。
为了更清楚地说明 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)
更新
试图汇集所有答案的本质,解决方案必须如下所示: 年龄段 {
static func getAge() ->Int {
var age: Int = 0
for items in dataArray {
while items.firstName == "Steven" {
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
}
}
此代码有效(有第二次中断)但仅适用于第一个循环。剩下的问题是,如何在循环达到目标后设置 return 和 break。 return 或 break 都会阻止另一步。
最佳答案
导致 age
在其返回之前初始化的可能程序流路径并不详尽。如果 dataArray
为空,则永远不会进入 for ... in
循环体,并且永远不会初始化 age
。在您的特定示例中解决此问题的最简单方法是在声明时将 age
初始化为 0
。
关于“意外的”0
返回,即使 dataArray
包含一个元素的 name
属性值为 "Steven"
:对于 for ... in
循环中的每个传递,不 包含具有 name
属性值 的元素“Steven”
,您将将 age
的值重置为 0
。这意味着只有当 "Steven"
值元素是 dataArray
的最后一个时,非 0
age
值(value)坚持。我真的没有看到任何理由在初始化之后再次将 age
设置为 0
,所以你可以通过例如解决这个问题在匹配的情况下从 for
循环执行提前退出 (break
)。或者,根据您想要实现的目标,只需在第一次匹配时从方法中return
items.last_updated
(请注意,早期的return
语句可能影响性能)。
关于swift - 数组搜索功能在 Swift 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604743/