我现在正在学习 Swift,在类(class)中我们有一个类(class)是制作一个简单的应用程序。现在,我遇到了一些无法正常工作的文本字段编程问题。
这是我的代码:
class ViewController: UIViewController {
@IBOutlet weak var refeicaoField: UITextField?
@IBOutlet weak var felicidadeField: UITextField?
@IBAction func addRefeicao(sender: UIButton) {
if refeicaoField == nil || felicidadeField == nil {
return
}
let nomeRefeicao = refeicaoField!.text
let valorFelicidade = felicidadeField!.text
let valorFelicidadeInt = Int(valorFelicidade!)
let novaRefeicao = Meal(nomeAlimento: nomeRefeicao, alegriaEmComer: valorFelicidadeInt)
}
}
问题从这里开始:
let novaRefeicao = Meal(nomeAlimento: nomeRefeicao, alegriaEmComer: valorFelicidadeInt)
它说的是:可选 'Int?' 的值未展开;你是不是想用'!'或者 '?'以及可选的“String?”的值未展开;你是不是想用'!'或“?”
我有点困惑,因为在类(class)示例中他们是这样做的:
let novaRefeicao = Meal(nomeAlimento: nomeRefeicao, alegriaEmComer: valorFelicidadeInt!)
并且工作了,但对我来说没有。如果我尝试输入 '!'在这两个变量中,我有一个感叹号警告,提示 let novaRefeicao 没有用。
怎么了?
编辑:
使用此处找到的所有提示进行了一些更改,现在我的代码如下:
class ViewController: UIViewController {
@IBOutlet weak var refeicaoField: UITextField!
@IBOutlet weak var felicidadeField: UITextField!
@IBAction func addRefeicao(sender: UIButton) {
if refeicaoField == nil || felicidadeField == nil {
return
}
let nomeRefeicao = refeicaoField!.text
let valorFelicidade = felicidadeField!.text
if nomeRefeicao == nil {
return
}
if let valorFelicidadeInt = Int(valorFelicidade!) {
let novaRefeicao = Meal(nomeAlimento: nomeRefeicao, alegriaEmComer: valorFelicidadeInt)
} else {
return
}
}
}
现在我再次收到有关解包的错误,但现在用“nomeRefeicao”代替。试图把 '!'在其中,但随后表明 let novaRefeicao 是不可变值。
最佳答案
您应该明白,Swift 语言在过去的一年里发生了很多的变化,并且感叹号随着时间的推移发生了很大的变化。如果您的示例甚至来自 2015 年年中,那么您正在查看过时的语法。
具有 ?
的值意味着该项目可能包含一个值……也可能不包含。
具有 !
的值意味着您正在强行打开一个可能相当危险的对象,请谨慎使用它,并且仅当您确定它不会导致崩溃时才使用它。
如果你有一个可选值,你可以像这样安全地解包它:
guard let unwrapped = wrapped else {
return
}
或
if let unwrapped = wrapped {
print(unwrapped)
}
多一点信息,如果你有一个初始化的可选值,你真正得到的是:
enum Optional<A> {
case None
case Some(A)
}
这就是为什么你不能在不打开它的情况下使用你的值......它被“包装”在一个可选的枚举中,这个枚举要么有值,要么没有。
您的代码添加了一点安全措施:
class ViewController: UIViewController {
@IBOutlet weak var refeicaoField: UITextField?
@IBOutlet weak var felicidadeField: UITextField?
@IBAction func addRefeicao(sender: UIButton) {
guard let refeicaoField = refeicaoField!.text else {
return
}
guard let felicidadeField = felicidadeField!.text else {
return
}
let nomeRefeicao = refeicaoField ?? "error" // added protection
let valorFelicidade = felicidadeField ?? "error" // added protection
let valorFelicidadeInt = Int(valorFelicidade) ?? 0 // defaults to '0' in case of issue
}
}
关于swift - 学习 Swift,创建对象时不展开可选类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34696813/