swift - 学习 Swift,创建对象时不展开可选类型的值

标签 swift

我现在正在学习 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/

相关文章:

ios - 无法将结构附加到数组属性

ios - 将多个数据添加到核心数据的开头 (Swift)

ios - 解析 PFUser.currentUser 返回 nil - Swift

swift - 使用关联值时获取枚举名称

arrays - 使用 unicode 字符串对数组进行排序

objective-c - 类型 'Boolean' 不符合协议(protocol) 'BooleanType'

ios - 如何在我的iOS Xing App中深度链接到个人资料?

swift - applicationShouldTerminate 在 macOS Swift 应用程序中意外调用

ios - 错误: Type [AnyHashable: Any]?没有下标成员(Swift)

ios - 将 Stripe token 推送到 Cloud Function Firebase (iOS Swift 3)