如何使用可选链接来解包swift变量

时间:2016-07-28 18:41:08

标签: ios swift

我收到了以下编译错误

  

“可选类型'String的值?'没打开;你的意思是用   '!'或'?'?“

这是我的代码

@IBAction func registerButtonTapped(sender: AnyObject)
{
    let userEmail = userEmailTextField.text;
    let userPassword = userPasswordTextField.text;
    let userConfirmPassword = confirmPasswordTextField.text;

    // check for empty fields
    if userEmail.isEmpty || userPassword.isEmpty || userConfirmPassword.isEmpty
    {
        //Display alert message
        displayMyAlertMessage("All fields are required");
        return;
    }

错误显示在第:

if userEmail.isEmpty || userPassword.isEmpty || userConfirmPassword.isEmpty

2 个答案:

答案 0 :(得分:1)

了解Swift基础知识,查看Optional Chaining指南以获取有关此类问题的帮助。

但总的来说......

任何textField.text属性都是可选的,这意味着它可以是nil。

因此,像userEmail这样的变量也是可选的,可能是零。

您无法在未首先解包的情况下调用可选变量的属性或方法。有两种方法可以做到这一点。

userEmail!.isEmpty表示您保证userEmail不是nil

userEmail?.isEmpty说可能你不确定并且只检查isEmpty是userEmail恰好不是nil

您也可以使用if:

打开可选项
if let userEmail = userEmail, userPassword = userPassword, userConfirmPassword = userConfirmPassword where userEmail.isEmpty || userPassword.isEmpty || userConfirmPassword.isEmpty {
    //do stuff
}

这是我能给出的最好的简短解释。学习,学习,编码。

答案 1 :(得分:0)

您尚未打开代码中的文本字段。

系统不知道文本字段中是否存在文本。所以,当你说:

let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;
let userConfirmPassword = confirmPasswordTextField.text;

userEmail,userPassword和userConfirmPassword中的值是Optional Strings。要强行打开它们,您可以执行以下操作:

let userEmail = userEmailTextField.text!;
let userPassword = userPasswordTextField.text!;
let userConfirmPassword = confirmPasswordTextField.text!;

但是,请记住,如果用户没有在文本字段中输入任何值,您将会崩溃。

而不是强行展开,你应该使用安全解包,如下所示:

if let userEmail = userEmailTextField.text {
    //Do something
} else {
    //Handle case where input is nil
}

您可以阅读有关选项及其解包的更多信息here