为什么我可以有非可选字段而没有初始化器?

13 浏览
0 Comments

为什么我可以有非可选字段而没有初始化器?

我有一个测试类:

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! 有什么区别?

0
0 Comments

为什么可以有非可选字段和没有初始化器?

在Swift中,String!是一个隐式解包的可选值。如果尝试在其为nil且不希望它为nil时访问其值,它仍然会导致应用崩溃。隐式解包的可选值对于在初始化时无法设置值但在使用之前确定一定会设置的变量非常有用。相关信息如下:

隐式解包的可选值在底层上是一个普通的可选值,但可以像非可选值一样使用,不需要每次访问时解包可选值。

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

0
0 Comments

为什么可以有非可选字段而没有初始化器?

在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!是一种特殊的可选类型,它在需要非可选类型的字符串时会自动解包,但同时也存在一定的风险。在使用时,我们需要根据具体情况来选择合适的可选类型声明方式,以确保程序的安全性。

0