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
包含属性id
,nam
和salary
。函数getInfo()
用于从用户获取信息。我想在flag!="y"
之前读取数据。我的索引超出范围错误。
输入数据的正确方法是什么?我们可以索引对象吗?
答案 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