我正在使用 Swift 在 xCode 7 中构建一个非常简单的登录验证应用。我对 Swift 非常陌生并且通常构建应用程序,因此我对部分代码遇到了一些困难。
我检查用户是否已将任何字段留空,如果有,则会收到错误提示消息。
然而,当我去构建我的项目时,我收到错误:
可选类型的值'字符串?'没有打开;
这是我的代码:
let userEmail = userEmailTextField.text
let userPassword = userPasswordTextField.text
let userRepeatPassword = repeatPasswordTextField.text
if(userEmail.isEmpty || userPassword.isEmpty || userRepeatPassword.isEmpty){
displayAlertMessage("All fields are required.") // custom made function
return;
}
感谢任何帮助。
此外,如果有人能够解释为什么我的代码无法正常运行,那就太棒了!因为,我似乎无法理解其他论坛的解释或修复。
答案 0 :(得分:2)
这里的问题是text
的属性UITextField
是一个可选字符串,所以你必须改变这样:
let userEmail = userEmailTextField.text!
let userPassword = userPasswordTextField.text!
let userRepeatPassword = repeatPasswordTextField.text!
或像这样使用
guard let userEmail = userEmail, let userPassword = userPassword, let userRepeatPassword = userRepeatPassword where !userEmail.isEmpty && !userPassword.isEmpty && !userRepeatPassword.isEmpty else {
displayAlertMessage("All fields are required.") // custom made function
return;
}
答案 1 :(得分:1)
如前所述,UITextField
的属性text
属于String?
类型(又名Optional<String>
),因此您无法直接应用方法或获取String
的属性}。
强制解包(!
)会非常危险,因为该属性实际上可能是nil
。
在这种情况下,您可以选择处理Optional值:
if let
,但guard let
或有时while let
可能有用。?.
表示的可选链接。也许你正在其他地方使用它。??
提供默认值。对于后两者,我得到这一行:
if((userEmail?.isEmpty ?? true) || (userPassword?.isEmpty ?? true) || (userRepeatPassword?.isEmpty ?? true)) {
如您所见,userEmail
的类型为String?
,因此我选择了可选链接:
userEmail?.isEmpty
可能会返回三种值:
Optional.Some(true)
Optional.Some(false)
Optional.None
(这称为nil
)(为了便于阅读,我省略了指定<Bool>
。)
它仍然是可选的,因此我添加了?? true
来提供nil
案例的默认值。
userEmail?.isEmpty ?? true
Optional.Some(true)
- &gt; true
(??
的左侧不是nil
,使用lhs值解包)Optional.Some(false)
- &gt; false
(??
的左侧不是nil
,使用lhs值解包)Optional.None
- &gt; true
(??
的左侧是 nil
,因此使用了右侧值)您知道,当文字为nil
时,您应该将其视为为空,因此为true
案例提供默认值nil
是恰当的。< / p>
你需要为所有三个变量编写类似的代码,然后你得到我上面显示的那一行。