Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组搜索功能在Swift中不起作用_Swift_Function_Search - Fatal编程技术网

数组搜索功能在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
do
var 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")