2016-07-28 31 views
-5

我已經收到以下編譯器錯誤如何使用可選的鏈接解開迅速變量

「可選類型的值'字符串?不打開;你的意思是使用 '!'或'?'?「

這是我的代碼

@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 
+0

這是什麼問題? – matt

回答

0

您尚未打開代碼中的文本字段。

系統不知道文本框中是否存在文本。所以,當你說:

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

userEmail,userPassword和userConfirmPassword中的值是可選字符串。要強制解開它們,你可以做到以下幾點:

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

1

刷上斯威夫特基礎知識,請查看Optional Chaining指南幫助有這樣那樣的問題。

但總的來說...

任何textField.text屬性是可選的,這意味着它可能是零。

因此,像userEmail這樣的變量也是可選的,可能爲零。

如果不首先展開,則不能調用可選變量的屬性或方法。有兩種方法可以做到這一點。

userEmail!.isEmpty說,你保證USEREMAIL不是零

userEmail?.isEmpty說,也許你不知道,只有檢查的isEmpty是USEREMAIL恰好不爲零

您也可以解開一個可選的使用,如果讓:

if let userEmail = userEmail, userPassword = userPassword, userConfirmPassword = userConfirmPassword where userEmail.isEmpty || userPassword.isEmpty || userConfirmPassword.isEmpty { 
    //do stuff 
} 

這是我能給出的最好的簡短解釋。學習,學習,編碼。