可选类型“字符串?”的值未解包错误

Posted

技术标签:

【中文标题】可选类型“字符串?”的值未解包错误【英文标题】:Value of optional type 'String?' not unwrapped error 【发布时间】:2015-10-18 03:48:30 【问题描述】:

第一次使用 Swift 编码。我不断收到“可选类型‘字符串’的值?在我声明if 语句的条件的那一行出现了“未解包”错误。我究竟做错了什么?

@IBAction func registerButtonTapped(sender: AnyObject) 

    let userName = userNameTextField.text;
    let userPhoneNumber = userPhoneNumberTextField.text);
    let userPassword = userPasswordTextField.text;
    let userReenterPassword = userReenterPasswordTextField.text;

    // Check for empty fields
    if(userName.isEmpty || userPhoneNumber.isEmpty || userPassword.isEmpty)
    
        //Display alert message

        return;
    

【问题讨论】:

【参考方案1】:

用户名是可选的字符串。所以它可以为零。为了解决这个问题,你需要像下面的代码一样打开它 sn-p if ((userName?.isEmpty ||userPhoneNumber?.isEmpty || userPassword?.isEmpty)) 有关更多信息,请查看此处: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

【讨论】:

您不需要像这样打开它吗:userName!.isEmpty || ... Apple 正在推动开发者不要只使用可选的!并且只有将相同的规则应用于 API 才有意义。这样做的原因是它可以为 nil,如果用 ? 声明它没有任何区别或者 !用于运行代码。使用 !实际上只是删除了 Xcode 中非常方便的警告,尤其是在涉及 API 代码时。如果您没有意识到它实际上是可选的,那么您只是在自找麻烦。 ***.com/questions/32621022/…【参考方案2】:

访问多个字段的惯用方法是:

if let userName = userNameTextField.text,
    let userPhoneNumber = userPhoneNumberTextField.text,
    let userPassword = userPasswordTextField.text,
    let userReenterPassword = userReenterPasswordTextField.text 
  // all values bound and not `nil`
  // ...
 else 
  // display alert message

  return

func foo () 
  guard let userName = userNameTextField.text,
        let userPhoneNumber = userPhoneNumberTextField.text,
        let userPassword = userPasswordTextField.text,
        let userReenterPassword = userReenterPasswordTextField.text else 
     // display alert message

     return
    

  // good here
  // ...

【讨论】:

以上是关于可选类型“字符串?”的值未解包错误的主要内容,如果未能解决你的问题,请参考以下文章

可选类型 '()?' 的值未打开

可选类型“字符串”的值未展开;你的意思是用'!或者 '?' [复制]

可选类型字符串的值?未打开

可选类型的值必须被解包以引用成员,但它是隐式解包的可选属性

可选类型“UIImage?”的值未打开

可选类型 'NSURL?' 的值未拆封;你的意思是用'!'或者 '?'?