数组搜索功能在Swift中不起作用
我承认自己有点傻,但经过几个小时的努力,我不得不问:数组搜索功能在Swift中不起作用,swift,function,search,Swift,Function,Search,我承认自己有点傻,但经过几个小时的努力,我不得不问: class AGE { static func getAge() -> Int { var age: Int for items in dataArray { if items.name == "Steven" { age = items.age } else {
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
,但随后函数返回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
}
}
此代码有效,(第二次中断时)但仅限于第一个循环。剩下的问题是,如何在循环达到其目标后设置返回和中断。返回或中断将阻止另一个步骤。在返回之前导致初始化
age
的可能程序流路径并不详尽。如果dataArray
为空,则主体f将永远不会输入for…in
循环,也永远不会初始化age
。在您的特定示例中,解决此问题的最简单方法是在声明时将age
初始化为0
关于“意外的”
0
返回,即使dataArray
包含一个属性值为的名称的元素时也是如此。“Steven”
:对于for·········································
,您将把age
的值重置为0
。这意味着仅当的
value元素是数据数组的最后一个
非0
age
值是否会持续存在。在初始化之后,我真的看不到任何理由再次将age
设置为0
,因此您可以通过执行提前退出(break
)来解决这个问题在匹配的情况下,从for
循环中。或者,根据您想要实现的目标,只需返回项。在第一次匹配时,上次更新方法中的(请注意,早期返回
语句可能会影响性能)。您需要在开始时初始化它:
var age: Int = 0
如果出于某种原因,for循环没有执行,那么当您仅将年龄变量声明为var age:Int而未初始化它时,就无法设置年龄变量
关于:
我甚至尝试在开始时设置var-age:Int=0
,但是
函数返回0
这意味着您已将age变量初始化为0
,for循环从未执行,返回值将为0
,我不是Swift开发人员,但我怀疑这些逻辑是否正确。假设您按照其他答案中的建议将age初始化为0,在找到与“Steven”匹配的元素后在数组中,您应该退出。否则下一次迭代可能会再次将年龄设置为零
请记住,默认情况下,for
语句会迭代所有元素。如果您希望迭代直到满足某个条件,则while
可能更合适
我已经阅读了一篇文章,并使用在上共享我的代码在线测试了这段代码
当从循环中出现时,可能是因为找到了“Steven”或所有元素都已检查但未找到。如其他答案中所述,问题是如果数组为空,则永远不会设置变量
除此之外,如果Steven
是数组中的最后一项,则代码效率低下,仅返回预期结果。否则变量age
将被0覆盖
然而,在Swift中,有比重复循环更方便的方法来过滤数组中的项目,例如first(其中:
class AGE {
static func getAge() -> Int {
return dataArray.first(where: { $0.name == "Steven" })?.age ?? 0
}
}
或者,如果Steven
不在数组中,则最好返回nil
class AGE {
static func getAge() -> Int? {
return dataArray.first(where: { $0.Name == "Steven" })?.age
}
}
PS:您代码中上次更新的
与结构人
完全无关。我测试了瓦迪安的答案,根据您的要求,它似乎是正确的
尽管如此,以下是其他建议:
首先,基于Person结构创建数组的另一个实例:
如果要根据名字在dataArray中搜索年龄:
要获取“Steven”的年龄值:
你会得到结果:23
请注意,您也可以通过return获取Int值:
func getAge(of name: String) -> Int {
filteredPerson = dataArray.filter { $0.name == name }
return filteredPerson[0].age }
另一方面,如果列表中有许多同名的人,并且希望获取特定人的年龄值,只需添加lastName参数:
func getAge(name: String, lastName: String){
filteredPerson = dataArray.filter { $0.firstName == name && $0.lastName == lastName }
print (filteredPerson[0].age) }
然后通过调用获取年龄值:
getAge(name: "Steven", lastName: "Miller")
希望这有助于某些人:什么是<代码>数据数组< /代码>?根据您的确切用例,您可能需要考虑在<代码>数据阵列< /COD>空的情况下制作<代码>年龄>代码> NIL<代码>空。“没有年龄"。现在我添加了dataArray。那么我必须在哪里初始化var age:Int=0呢?而不是var age:Int
dovar age:Int=0
那么,我总是得到0
这是因为你从未输入你执行。试着在for循环中设置一个断点。我不明白的是:如果我在内部进行打印输出for-in循环中,age得到了cougt(请参阅我新的第三个代码)。难道没有办法将“age”值从函数中抛出吗?当然,你是对的。我更正了。如果我使用了你建议的代码,我会得到错误:“无法调用非函数类型的值Person
”你的回答听起来很合理。我试图按照你建议的方式更改代码。剩下的问题是,返回后如何设置中断?请参阅新建编辑。
getAge(of: "Steven")
func getAge(of name: String) -> Int {
filteredPerson = dataArray.filter { $0.name == name }
return filteredPerson[0].age }
func getAge(name: String, lastName: String){
filteredPerson = dataArray.filter { $0.firstName == name && $0.lastName == lastName }
print (filteredPerson[0].age) }
getAge(name: "Steven", lastName: "Miller")