は、2つの変数、オプションのx
と暗黙的に開封されたオプションy
です:この2つのoptionalsの暗黙のうちにアンラップされたオプションをアンラップするのはなぜですか?私は、文字列の補間はここスウィフト3でどのように機能するかを理解することはできません
let x: Int? = 1
let y: Int! = 2
印刷はかなりロジックになります:
print(x) // Optional(1)
print(y) // 2
しかし、なぜ文字列補間が他の方法で機能しますか?
print("x: \(x)") // x: Optional(1)
print("y: \(y)") // y: Optional(2)
まだアンラップされたオプションをアンラップするのはなぜですか?
print("y: \(y!)") // y: 2
のは、ここで仮定しましょうがString
にInt!
を変換するdescription
プロパティを使用していますCustomStringConvertible
プロトコルを使用しました。しかし、なぜここにはないy: Optional(2)
ですか?
print("y: \(y!.description)") // y: 2
print("y: \(y?.description)") // y: Optional("2")
print("y: \(y.description)") // y: 2
誰でも説明できますか?
回答ありがとうございました。第2のケースでは「文字列?」に関する素晴らしい点があります。しかし、 'print(" y:\(y) ")'が 'y:Optional(2)'を与える理由は説明していません。編集:重複タグ – Leo
これは、これがリンクされている他の質問に記載されているように、型システムの欠点です。うまくいけばそれは修正されますが、私はそれ以上の睡眠を失うことはありません。暗黙のうちにラップされていないオプションを使用しないでください。IBOutletsと再帰的なクロージャーを除いて、ほとんどの場合、それらの理由はありません。 – Alexander
Obj-CとSwiftの相互作用が主な原因です。私にとっては、「初期化時に定義できない定数」でした。しかし、SE-0054は本当に "暗黙的にアンラップされたオプション"を "シュレーディンガーのオプション"に変換します。 – Leo