Swift 为什么我可以有一个非可选字段和没有初始值设定项

Swift 为什么我可以有一个非可选字段和没有初始值设定项,swift,initialization,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 =

我有一门考试课:

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?

var previewJson: String!

String是一个。如果您尝试访问应用程序的值,而该值为
nil
,并且您不希望它出现,则应用程序仍会崩溃。隐式展开选项对于无法在初始化时为其设置值的变量非常有用,但要知道,在使用之前肯定会设置这些变量。相关:

隐式展开的可选项是 场景,但也可以像非可选值一样使用,而不使用 每次访问可选值时,需要将其展开


既不是
var-previewJson:String?
也不是
var-previewJson:String
将需要一个自定义的
init
,因为它们都将默认值设置为
nil

字符串是一个。如果您尝试访问应用程序的值,而该值为
nil
,并且您不希望它出现,则应用程序仍会崩溃。隐式展开选项对于无法在初始化时为其设置值的变量非常有用,但要知道,在使用之前肯定会设置这些变量。相关:

隐式展开的可选项是 场景,但也可以像非可选值一样使用,而不使用 每次访问可选值时,需要将其展开

既不是
var-previewJson:String?
也不是
var-previewJson:String
将需要自定义
init
,因为它们都将默认值设置为
nil

两者的区别是什么

var previewJson: String?
var previewJson: String?

var previewJson: String!
不多。它们都是可选的,表面上包裹着一根线。它们都自动初始化为
nil
。它们都受相同的规则管辖。差不多

主要区别在于
String
您可以说类似于
previewJson.lowercased()
之类的话,而无需显式地展开可选代码

你明白为什么这很特别吗?使用
String?
您必须说
previewJson?.lowercased()
previewJson!。小写()
。您也可以使用
String,但您不必这样做,因为
字符串
遵循一条特殊规则,即如果在需要非可选字符串的地方使用它,它将为您打开可选字符串

所以一个
字符串
是可选的,就像
字符串?
一样,只是在某些压力条件下,它会自动展开。就这些

两者的区别是什么

var previewJson: String?
var previewJson: String?

var previewJson: String!
不多。它们都是可选的,表面上包裹着一根线。它们都自动初始化为
nil
。它们都受相同的规则管辖。差不多

主要区别在于
String
您可以说类似于
previewJson.lowercased()
之类的话,而无需显式地展开可选代码

你明白为什么这很特别吗?使用
String?
您必须说
previewJson?.lowercased()
previewJson!。小写()
。您也可以使用
String,但您不必这样做,因为
字符串
遵循一条特殊规则,即如果在需要非可选字符串的地方使用它,它将为您打开可选字符串


所以一个
字符串
是可选的,就像
字符串?
一样,只是在某些压力条件下,它会自动展开。仅此而已。

请先看。它们间接地帮助你更好地了解optionalsAlso先看后看。它们间接地帮助您更好地了解OptionalSal,因此我应该添加
字符串也很危险。这是因为如果它是
nil
,并且您确实说了类似
previewJson.lowercased()
的话,您将崩溃。一个普通的可选选项会让你在崩溃前思考自己在做什么,但是一个自动展开的可选选项只会崩溃而不眨眼也很危险。这是因为如果它是
nil
,并且您确实说了类似
previewJson.lowercased()
的话,您将崩溃。一个普通的选项会让你在崩溃前思考自己在做什么,而一个自动展开的选项只会崩溃而不眨眼。