为什么我可以有非可选字段而没有初始化器?
为什么我可以有非可选字段而没有初始化器?
我有一个测试类:
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
是一个字符串类型,但是我不需要初始化程序来设置它,即使它是一个非可选字段它也以默认值nil开始(我认为)。
我是否误解了!对字段的作用?
var previewJson: String?
和 var previewJson: String!
有什么区别?
为什么可以有非可选字段而没有初始化器?
在Swift中,我们可以声明可选类型的变量,用来表示该变量的值可以是nil。可选类型使用问号(?)来标记,例如:var previewJson: String?。
在上面的代码中,previewJson变量的类型是String?,表示它可以是一个字符串,也可以是nil。这意味着在使用previewJson变量之前,我们必须显式地对它进行解包,以获取其中的值。
然而,Swift还提供了另一种可选类型的声明方式,即使用感叹号(!),例如:var previewJson: String!。
与String?不同的是,使用String!声明的变量在使用时不需要显式解包。这意味着我们可以直接使用previewJson.lowercased(),而不需要写成previewJson?.lowercased()或者previewJson!.lowercased()。
这是为什么呢?这是因为String!遵循了一种特殊的规则,即在需要非可选类型的字符串时,它会自动解包为非可选类型。这使得我们可以更方便地使用该变量,而不需要每次都进行解包操作。
需要注意的是,尽管String!提供了方便,但它也存在一定的风险。如果String!的值为nil,并且我们尝试使用类似于previewJson.lowercased()的操作,那么程序将会崩溃。这是因为String!的自动解包机制并不会在值为nil时进行安全检查,而是直接崩溃。
因此,虽然String!提供了便利,但我们在使用它时需要特别小心,确保它的值不为nil,以避免程序崩溃。
String!是一种特殊的可选类型,它在需要非可选类型的字符串时会自动解包,但同时也存在一定的风险。在使用时,我们需要根据具体情况来选择合适的可选类型声明方式,以确保程序的安全性。