2017-09-28 13 views
1

特に、非nil値または文字列リテラルを保証​​する3進数。私のクラスインサイド定数を代入するために3進数を使用するのはなぜですか?

: - "Hello World" の

var title: String? 

後で...

let currentTitle = (self.title != nil) ? self.title : "Hello world" 

currentTitleは、それが価値を保証する必要があるにもかかわらず、任意です。どうして?

+3

です。あなたはそれを自分で行う必要があります。ここで探しているツールは、nil coalescing演算子です: 'let currentTitle = title ?? "こんにちは世界"。 – Hamish

答えて

3

あなたはそれが常に値を持つことになります知っているが、型システムがそれを知りません。イニシャライザの式を型に変換すると、Bool ? String? : StringBool ? String? : String?に変換され、両方の腕が一致するようになります)のように見えます。

これを書くための適切な方法は、nil`がオプションをアンラップしない `と比較すると

let currentTitle = self.title ?? "Hello world" 
1

self.titleはオプションであり、3項演算子の結果の部分式の1つです。 Swiftは、2つの結果の部分式のタイプを調整して、式全体の型を決定しようとします。String?Stringを指定すると、String?を選択する必要があり、文字列リテラルをオプションで強制的に強制します。 self.titleをアンラップ力を試してみてください。

let currentTitle = (self.title != nil) ? self.title! : "Hello world" 
+0

このような強制アンラッピングを推奨しないでください。常に良い方法があります。 'self.title ?? "Hello world"はここで正しい解決策です。 –

+0

ありがとうございます。あなたは完全に私の質問に答えましたが、ケビンの方法はよりクリーンでより直接的なようです – inorganik

関連する問題