2017-02-16 4 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)を参照してください[ここ] http:// stackoverflow。com/questions/27797351/class-has-no-initializers-swift/40769917#40769917)。彼らは間接的に*あなたがオプションのより良い画像を得るのを助ける – Honey

+0

[こちら](https://stackoverflow.com/questions/37493241/swift-string-vs-string-vs-string)を参照してください – Honey

答えて

3

String!の違いは何

implicitly unwrapped optionalです。 nilの値にアクセスしようとすると、アプリがクラッシュしてしまい、期待していません。暗黙的にアンラップされたオプションは、初期化時に値を設定することはできませんが、使用する前に確実に設定されることがわかっている変数にとって有益です。関連:

アン暗黙的に開封されたオプションは 舞台裏オプション通常ですが、 は、オプションの値にそれがアクセスされるたびにアンラップする必要がなくても、nonoptional値と同じように使用することができます。彼らは両方のnilのデフォルト値を設定しているので、

var previewJson: String?var previewJson: String!どちらもカス​​タムinitが必要になります。

1

var previewJson: String? 

var previewJson: String! 

あまり違いは何ですか。彼らは両方とも、文字列を表面的にラッピングするオプションです。これらはともにnilに自動初期化されます。それらはどちらも同じルールによって管理されています。ほぼ。

主な違いは、String!では、「オプション」の明示的なアンラッピングを行わずにpreviewJson.lowercased()などと言うことができます。

これはなぜ特別なのですか? String?の場合、previewJson?.lowercased()またはpreviewJson!.lowercased()と言う必要があります。 String!がnonOptional文字列が予想される場所あなたがそれを使用する場合、それはあなたのためのオプションのラップを解除することを特別なルールに従っているためではないは、へを持っているあなたはString!と同じことを行うことができますが、やります。

したがって、String!は、特定のストレス条件の下で自分自身をアンラップすることを除いて、String?のようにオプションです。そしてそれはすべてです。

+1

私は、その「String!」も危険です。これは、_is_ 'nil'と' previewJson.lowercased() 'のようなものを_do_するとクラッシュするからです。通常のオプションでは、クラッシュする前に何をしているのか考えることができますが、self-unwrappingオプションは、まつげを打つことなくクラッシュします。 – matt

関連する問題