带有感叹号的类属性仍作为可选

时间:2017-01-06 22:28:20

标签: swift optional

我将课程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中标有感叹号,因此应该将其解包。为什么它仍然返回一个可选的?

编辑: 按要求使用prepareForSegue方法:

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

1 个答案:

答案 0 :(得分:0)

首先,您的scoreModelnot non-optional

  

您可以使用感叹号而不是a来声明可选变量   问号。这些可选变量将自动解包   您不需要在结尾使用任何进一步的感叹号   变量来获取指定的值。

在您的情况下,您可以为teamName分配可选值或非可选值。因此,如果为其分配了可选值,则需要将其解包以供使用。