可选类型'字符串的值?'检查值是否为空时未解包

时间:2016-08-28 12:13:54

标签: ios swift

我正在使用 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;
}

感谢任何帮助。

此外,如果有人能够解释为什么我的代码无法正常运行,那就太棒了!因为,我似乎无法理解其他论坛的解释或修复。

2 个答案:

答案 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可能有用。
  • 使用以?.表示的可选链接。也许你正在其他地方使用它。
  • 使用nil-coalescing运算符??提供默认值。

对于后两者,我得到这一行:

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
  • lhs:Optional.Some(true) - &gt; true??的左侧不是nil,使用lhs值解包)
  • lhs:Optional.Some(false) - &gt; false??的左侧不是nil,使用lhs值解包)
  • lhs:Optional.None - &gt; true?? 的左侧是 nil,因此使用了右侧值)

您知道,当文字为nil时,您应该将其视为为空,因此为true案例提供默认值nil是恰当的。< / p>

你需要为所有三个变量编写类似的代码,然后你得到我上面显示的那一行。