2017-06-17 85 views
0

不工作,我承认有点感觉愚蠢,但试图小时后我要问:阵列搜索功能斯威夫特

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) 

更新

试图组装所有答案的本质,解决方案必须是这样的: 类AGE {

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 
    } 
} 

此代码工作,(与第二次休息),但只适用于第一个循环。剩下的问题是,在循环达到目标后如何设置返回和中断。返回或中断将阻止另一个步骤。

+0

什么是'dataArray'? – paper1111

+0

根据您的确切用例,您可能需要考虑在'dataArray'为空的情况下使'age'可选,返回'nil'。正如在这种情况下,答案是“年龄是多少?”可能不是“刚创建”,而是“没有年龄”。 – Hamish

+0

现在我添加了dataArray。 –

回答

3

在返回之前导致age初始化的可能的程序流路径并非详尽无遗。在dataArray为空的情况下,将永远不会输入for ... in循环的主体,并且age将永远不会初始化。在您的特定示例中解决此问题的最简单方法是在声明后初始化age0

关于即使万一dataArray的“意外” 0收益包含与name财产价值"Steven"的元素:在for ... in循环,它每次经过包含有name财产价值"Steven"的元素,你会age的值重置为0。这意味着只有在"Steven"值元素是dataArray中的最后一个时,值才会保持不变。我没有看到任何理由在初始化之后再次将age设置为0,因此您可以通过例如解决此问题。如果匹配,则从for循环执行提前退出(break)。或者,根据您想要实现的内容,只需在第一次匹配时从方法中获得returnitems.last_updated(注意早期的return语句可能会影响性能)。

+0

你的回答听起来很合理。我试图以您建议的方式更改代码。现在仍然存在的问题是,如何在退货后设置休息时间?查看新的编辑。 –

1

你需要用来初始化它的开头:

var age: Int = 0 

如果由于某种原因,你的for循环鸵鸟政策执行,那么你不容设置你的年龄变量时,你只需要声明它作为var age: Int和没有启动它。

以及有关:

I even tried to set var age: Int = 0 at the beginning, but then the function return 0

这意味着,你有你的intilizied向age variable0 for循环,其中从未执行,回报将是0

+0

所以我到底需要初始化var age:Int = 0 ? –

+0

而不是'var age:int' do'var age:Int = 0' –

+0

那么,我总是会'0' –

2

我不是Swift开发者,但我怀疑这些逻辑是正确的。假设你按照其他答案中的建议将age初始化为0,当你在数组中找到匹配“Steven”的元素后,你应该退出。否则,下一次迭代可能会将年龄再次设置为零。

请记住,默认情况下,for语句遍历所有元素。如果你想迭代直到满足条件,那么while可能更适合。

我读过tutorial并使用swift sand box在线测试此代码。在this link上分享我的代码。

class AGE { 
    static func getAge() -> Int { 
     var age = 0 
     var found = false 
     var current = 0 
     var allElementsChecked = (dataArray.count == 0) //is false unless array is empty 
     while !found && !allElementsChecked { 
      found = (dataArray[current].name == "Steven") 
      allElementsChecked = (current == dataArray.count-1) 
      current += 1 
     } 
     if found 
     { 
      age = dataArray[current-1].age //minus 1 to undo last increment within loop 
     } 
     return age 
    } 
} 

当从循环中出来时,可能是因为“Steven”被找到或者所有元素都被检查并未找到。

2

正如其他答案中提到的问题是,如果数组为空,变量将永远不会被设置。

除此之外,如果Steven是数组中的最后一项,那么您的代码效率低下,并且仅返回预期结果。否则变量age获取与0

尽管如此覆盖在夫特有更方便的方法来筛选的阵列比一个重复循环中的项目,例如first(where:

class AGE { 

    static func getAge() -> Int { 
     return dataArray.first(where: { $0.name == "Steven" })?.age ?? 0 
    } 
} 

,或者它可能是优选的,返回nil如果Steven是不是数组中

class AGE { 

    static func getAge() -> Int? { 
     return dataArray.first(where: { $0.Name == "Steven" })?.age 
    } 
} 

PS:last_updated在你的代码是不相关的结构Person在所有。

+0

我不理解的东西:如果我在for循环中进行打印输出,那么时间会变长。 (见我的新的第三个代码)。不一定有办法让功能中的“年龄”值被抛出去吗? –

+0

当然,你说得对。我纠正了。如果我使用你建议的代码,我会得到错误:“无法调用非函数类型'Person'的值” –