【问题标题】:Class property with exclamation mark still returned as optional [duplicate]带有感叹号的类属性仍然作为可选返回[重复]
【发布时间】:2017-01-06 22:28:20
【问题描述】:

我有一门课程ScoreModel 简化为:

class ScoreModel {
    var teamName : String!
}

它可以放在Init() 函数中,因为它需要始终设置,但这无助于我对问题的理解:

我有一个ScoreViewController : UIViewController,我使用非可选的ScoreModel

class ScoreViewController {
    var scoreModel : ScoreModel!
}

使用prepareForSegue 传递。这一切正常,但是当我想获取 teamName 时,它​​作为可选返回:

override func viewWillAppear(_ animated : Bool) {
    let name = scoreModel.teamName
    print(name) 
}

这个输出:

Optional("teamNameEntered")

但该变量在 ScoreModel 中标有感叹号,因此应将其解包。为什么它仍然返回一个 Optional?

编辑: 根据要求,prepareForSegue 方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? ScoreViewController {
        let scoreModel = self.scoreModel ?? ScoreModel()
        destinationVC.scoreModel = scoreModel
    }
}

【问题讨论】:

  • 你能发布 prepareForSegue 代码吗?
  • 添加了 prepareForSegue
  • 第 1 课:不要使用隐式展开的选项
  • 谢谢我找到了,奇怪的是我必须强制解开我隐含的解包选项。看起来很奇怪

标签: swift optional


【解决方案1】:

首先,您的scoreModelnot non-optional

您可以使用感叹号而不是 问号。此类可选变量将自动展开并 您不需要在结尾处使用任何进一步的感叹号 变量来获取赋值。

在您的情况下,您可以为teamName 分配一个可选值或一个非可选值。所以如果它被分配了一个可选值,你需要将它打开才能使用。

【讨论】:

  • 即使它标有“!”我还需要拆开吗?这是一种奇怪的做法,因为如果我将一个可选项应用于我定义为非可选的东西,我会崩溃我自己的应用程序。
  • 'teamName` 在您的情况下仍然是可选的。您刚刚用! 标记了它,以便自动展开。
  • 是的,自动展开部分失败了;)这就是我的问题的重点
猜你喜欢
  • 2012-03-20
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多