可选类型“字符串?”的值未解包错误
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
// ...
【讨论】:
以上是关于可选类型“字符串?”的值未解包错误的主要内容,如果未能解决你的问题,请参考以下文章