代码之家  ›  专栏  ›  技术社区  ›  bakarin

如何在swift 4中将数据读取到对象数组中

  •  -2
  • bakarin  · 技术社区  · 8 年前
    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" .我的索引超出范围错误。

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Joakim Danielson    8 年前

    您需要追加到数组中以使其增大。更换

    empData[count]=Employee()
    

    具有

    empData.append(Employee())
    

    避免索引超出范围错误

    更新

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

    repeat {
        var employee = Employee()
        employee.getInfo()
        empData.append(employee)
        flag=readLine()!
    }while( flag == "y" ) 
    
        2
  •  1
  •   Dávid Pásztor    8 年前

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

    你甚至不需要 count 变量,因为您可以简单地访问 empData.last 呼叫后安全 附加 并添加新的 Employee Array .

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

    我建议您认真考虑一下您的实施,因为它目前确实不安全。您没有以任何方式验证用户输入,因此 getInfo 如果用户输入不是预期的格式,函数很容易导致运行时错误。此外,为创建空的初始值设定项 员工 没有意义,您可以简单地创建一个可失败的初始值设定项,在其中读取输入,如果输入的形式不正确,则使初始值设定项返回 nil .

    class Employee{
        let id:Int
        let name:String
        let salary:Int
    
        init?(){
            guard let name = readLine() else { return nil }
            self.name = name
            guard let idString = readLine(), let id = Int(idString) else { return nil }
            self.id = id
            guard let salaryString = readLine(), let salary = Int(salaryString) else { return nil}
            self.salary = salary
        }
    }
    
    var flag="y"
    var empData:[Employee]=[]
    repeat {
        if let employee = Employee() {
            empData.append(employee)
        } else {
            // Display error message to the user
        }
        flag=readLine() ?? ""
    } while(flag=="y")