在swift中初始化一个具有数组作为属性的自定义对象

时间:2016-03-20 18:50:04

标签: ios arrays string swift class

创建了一个名为employee的类,如下所示:

class Employees: NSObject {

    var name: String
    var employeeRoles: [String]
    var departmentID: Int

    init(name:String, employeeRoles:[String], departmentID:Int){
        self.name = name
        self.employeeRoles = employeeRoles
        self.departmentID = departmentID
    }   
}

在视图中,有一个文本字段,您可以在其中输入员工角色,这些角色当然是字符串。我试图将相关信息输入到其各自的字段中,创建一个新的Employees对象并将其打印到调试控制台。但是,我们尝试将输入的字符串输入到视图中的以下行会导致程序崩溃,并且不会提供有关原因的更多信息:

let newEmployee = Employees(name:  (employeeFirstNameInputField.text! + " " +  (employeeLastNameInputField.text)!), employeeRoles:  (employeeListingInputField.text as? [String])!, departmentID: 0)

    print(newEmployee.name)

我在哪里错了?

2 个答案:

答案 0 :(得分:0)

您无法通过向下转换将字符串(employeeListingInputField.text)转换为字符串数组,因此as? [String]将失败并返回nil。 然后用!强制打开这个值,这将给你典型的"意外发现的nil ......异常。

使用时必须小心!正如这说的那样,我承诺这不是“不可能”。如果你违背承诺,你将受到例外的惩罚。

你有很多!这是因为你试图在一行代码中做所有事情。正确的做法是将这一行扩展为多行,您可以在其中检查值。如果例如名称为空白等,也可以显示相应的消息。

假设没有角色是可以的,你应该检查一个0长度的字符串并使用一个空数组而不是一个1元素的数组,这是一个空字符串。如果没有角色不行,那么下面的代码将更改为发出错误。您还可以使用guard语句来实现验证。

var roles=[String]()
if employeeListingInputField.text != nil && employeeListingInputField.text!.length > 0 {
    roles.append(employeeListingInputField.text)
 }

在初始化程序调用中使用roles

为了将来参考,将单个字符串转换为1个字符串字符串数组的方法只是说[myString]

答案 1 :(得分:0)

假设您的文本字段被声明为weak var textField: UITextField!,那么您可以像这样创建新员工。

let name = employeeFirstNameInputField.text + " " +  employeeLastNameInputField.text
let listings = employeeListingInputField.text.componentsSeparatedByString("\n")
let newEmployee = Employees(name: name, employeeRoles: listings, departmentID: 0)

您需要将列表文本字段中返回的字符串拆分为字符串数组。每个新数组元素由换行符分隔。还有其他方法可以做到这一点(比如调用split)。