【问题标题】:value of optional type 'string?' not unwrapped when checking if values are empty可选类型“字符串?”的值检查值是否为空时未解包
【发布时间】:2016-08-28 12:13:54
【问题描述】:

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

感谢任何帮助。

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

【问题讨论】:

  • 三个变量userEmailuserPassworduserRepeatPassword在你的帖子中没有描述。我可以做一些猜测,但最好添加一些关于它们的描述。
  • @OOPer 抱歉,我现在就添加它们
  • 您可以找到很多使用可选类型“字符串?”的值进行搜索的选项。没有展开。但我会使用 nil 合并运算符 (??) 编写检查代码,例如:if((userEmail?.isEmpty ?? true) || (userPassword?.isEmpty ?? true) || (userRepeatPassword?.isEmpty ?? true)) {。最好看看其他线程。
  • @OOPer 感谢您的评论。我会测试一下。

标签: ios swift


【解决方案1】:

这里的问题是UITextField 的属性text 是一个可选字符串,所以你必须这样更改:

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;
}

【讨论】:

  • 您介意解释一下这是什么意思吗?或者! 标记有什么作用? :) 谢谢顺便说一句,这确实解决了它!
  • @CaelanGrgurovic 请查看此快速指南:developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • @CaelanGrgurovic 如果我的回答解决了您的问题,请将其标记为正确,我将不胜感激,谢谢
  • 哦,别介意:/。它消除了错误,但是,在构建和测试时,应用程序停止了,它告诉断点位于 if 语句处。
  • 我没看懂问题,你能把错误截图发给我吗?无论如何,我用保护语句替换了 if
【解决方案2】:

如前所述,UITextFields 属性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)) {

如你所见,userEmails 类型是String?,所以我选择了可​​选链:

userEmail?.isEmpty

可能返回三种值:

  • Optional.Some(true)
  • Optional.Some(false)
  • Optional.None(这称为nil

(为了便于阅读,我省略了指定<Bool>。)


它仍然是可选的,所以我添加了?? true 来为nil 大小写提供默认值。

userEmail?.isEmpty ?? true
  • lhs:Optional.Some(true) -> true?? 的左侧不是nil,使用解包后的 lhs 值)
  • lhs:Optional.Some(false) -> false?? 的左侧不是nil,使用解包后的 lhs 值)
  • lhs:Optional.None -> true?? 的左侧 nil,所以使用右侧的值)

您知道,当文本为nil 时,您应该将其视为,因此为nil 大小写提供默认值true 是合适的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2021-11-07
    • 2012-05-06
    相关资源
    最近更新 更多