创建了一个名为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)
我在哪里错了?
答案 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
)。