我有这个测试类:
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!
答案 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?
一样,只是在某些压力条件下,它会为你解开。这就是所有。