2017-02-16 35 views
-1

我有這個測試類:爲什麼我有一個非可選字段並沒有初始化

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類型的,但我並不需要一個初始化設置它,並將其與默認啓動值爲零,即使它是一個非可選字段(我認爲)。

我誤解了什麼!對領域有用嗎?

是什麼

var previewJson: String? 

var previewJson: String! 
+0

首先看到[這裏](https://stackoverflow.com/questions/37400196/why-optional-constant-does-not-automatically-have-a-default-value-of-nil)then [here]( HTTP://計算器。COM /問題/ 27797351 /類有 - 無初始化 - 斯威夫特/ 40769917#40769917)。他們*間接*幫助你得到更好的選擇圖 – Honey

+0

也見[這裏](https://stackoverflow.com/questions/37493241/swift-string-vs-string-vs-string) – Honey

回答

3

String!之間的差別是implicitly unwrapped optional。如果您嘗試訪問其值nil並且您不期望它的值,它仍會使應用程序崩潰。隱式解包選項對於在初始化時無法設置值的變量很有用,但知道在使用前您一定會設置它。相關:

一個隱含解開可選的是一個正常的可選的 幕後,但也可以使用像一個非可選值,而不需要 每次訪問時間解開可選值。

無論var previewJson: String?也不var previewJson: String!將需要定製init因爲他們的nil都設置默認值。

1

是什麼

var previewJson: String? 

var previewJson: String! 

沒有太大的區別。他們都是可選項,表面上是包裝一個字符串。它們都自動初始化爲nil。它們都受同樣的規則約束。幾乎。

主要區別在於,使用String!可以說明如previewJson.lowercased()之類的內容,而不顯式解開可選項。

你明白爲什麼那麼特別嗎?用String?你必須說previewJson?.lowercased()previewJson!.lowercased()。您可以做同樣的String!,但你不知道來,因爲String!遵循特殊的規則,如果你用它其中非可選字符串的預期,這將解開可選你。

因此,一個String!是一個可選,就像一個String?除了在一定的壓力條件下,它會爲你解開自己。這就是全部是

+1

然而,我應該補充說, 'String!'也是危險的。這是因爲如果它是''nil''而你'_do_說'像'previewJson.lowercased()',你會崩潰。正常的選項可以讓你在崩潰之前思考自己在做什麼,但自解包可選只會在沒有打睫毛的情況下崩潰。 – matt

相關問題