为什么我可以使用非可选字段而不使用初始值设定项

时间:2017-02-16 22:42:54

标签: swift initialization

我有这个测试类:

class OrderParserTests: XCTestCase {

    var previewJson : String!

    override func setUp(){
        let path = Bundle(for: type(of: self)).path(forResource: "orderDocumentPreviewResponse", ofType: "json") ?? ""
        self.previewJson = try! String(contentsOfFile: path)
    }

    func testStandardOrder(){
        ...
    }
}

previewJson是String类型,但是我不需要初始化器来设置它,它以默认值nil开始,即使它是非可选字段(我认为)。

我误解了什么!对田地做了什么?

之间有什么区别
var previewJson: String?

var previewJson: String!

2 个答案:

答案 0 :(得分:3)

String!implicitly unwrapped optional。如果您尝试在nil时尝试访问其值并且您不期望它,它仍然会使您的应用崩溃。隐式解包的选项对于无法在初始化时设置值的变量很有用,但知道在使用之前肯定会设置。相关:

  

隐式展开的可选项是一个正常的可选项   场景,但也可以像非可选值一样使用,没有   需要在每次访问时解包可选值。

var previewJson: String?var previewJson: String!都不需要自定义init,因为它们都设置了默认值nil

答案 1 :(得分:1)

  

之间有什么区别
var previewJson: String?
     

var previewJson: String!

不多。它们都是Optionals,表面上包装了一个String。它们都自动初始化为nil。它们都受相同规则的约束。几乎。

主要区别在于,使用String!,您可以说previewJson.lowercased()之类的内容,而无需明确展开Optional。

你知道为什么这是特别的吗?使用String?,您必须说previewJson?.lowercased()previewJson!.lowercased()可以String!执行相同操作,但您 ,因为String!遵循特殊规则,如果您使用它,一个非可选的字符串是预期的,它将打开可选的 你。

所以String!是一个可选项,就像String?一样,只是在某些压力条件下,它会为你解开。这就是所有