如何在Swift 4中将数据读入对象数组

时间:2018-06-18 09:46:11

标签: swift class

class Employee{
    var id:Int
    var name:String
    var salary:Int

    init(){
        self.id=0
        self.name=""
        self.salary=0
    }

    func getInfo(){
        self.name=readLine()!
        self.id=Int(readLine()!)!
        self.salary=Int(readLine()!)!
    }
}


var count=0
var flag="y"
var empData:[Employee]=[]
repeat{
    count+=1
    empData[count]=Employee()
    empData[count].getInfo()
    flag=readLine()!

}while(flag=="y") `

我的课程Employee包含属性idnamsalary。函数getInfo()用于从用户获取信息。我想在flag!="y"之前读取数据。我的索引超出范围错误。

  

输入数据的正确方法是什么?我们可以索引对象吗?

2 个答案:

答案 0 :(得分:1)

您需要附加到数组以使其大小增加。替换

empData[count]=Employee()

empData.append(Employee())

避免索引超出范围错误

更新

为了让你的代码变得不那么可怕,我会做

repeat {
    var employee = Employee()
    employee.getInfo()
    empData.append(employee)
    flag=readLine()!
}while( flag == "y" ) 

答案 1 :(得分:1)

下标运算符不能用于向尚不存在的数组索引添加元素。如果您在初始化时知道​​数组将具有多少元素,或者使用append运算符在最后一个索引之后向数组添加新元素,则需要使用元素计数初始化数组。

您甚至不需要count变量,因为您可以在致电empData.last并向append添加新的Employee后安全地访问Array }。

var flag="y"
var empData:[Employee]=[]
repeat {
    empData.append(Employee())
    empData.last!.getInfo()
    flag=readLine()!
} while(flag=="y")

我建议你认真重新考虑你的实施,因为它目前真的不安全。您没有以任何方式验证用户输入,因此如果用户输入不是预期的形式,则getInfo函数很容易导致运行时错误。此外,为Employee创建一个空的初始化程序没有意义,你可以简单地创建一个可用的初始化程序,在那里你读取输入,如果输入的形式不正确,则使初始化程序返回{{1} }。

nil