2016-12-12 7 views
0

を与える私は、次のコードを持っている:私は、これは奇妙な見つけるproduct.priceはタイプPrice?であり、実行時にスウィフトネストされた非オプションの構造は、オプションの

product = Product(
    image: URL(string: "...")!, 
    title: "...", 
    price: Price(
     value: 5.99, 
     currency: "CAD" 
    ), 
    rating: 4.5, 
    url: URL(string: "...")! 
) 

struct Product { 
    var image: URL! 
    var title: String! 
    var price: Price! 
    var rating: Float! 
    var url: URL! 
} 

struct Price { 
    var value: Double! 
    var currency: String! // should be enum 
} 

を私は後にProductを初期化します暗黙のうちにアンラップされているからです。

私はPriceinit()メソッドを与えてみましたが、同じ結果が出ました。また、Product定義でvar price: Price! = Price(value: 0, currency: "CAD")を使用して試したところ、同じ結果が得られました。 (メンバーワイズイニシャライザをPriceに追加します)

ここでは何が起こっていますか?

+1

なぜ構造体のプロパティは暗黙のうちにアンラップされていますか?これは明らかではない。とにかく値をアンラッピングしているので、オプションではないプロパティを使用して、メンバーワイド初期化子を使用するだけです。 – Moritz

+0

* "' product.price'のタイプが '' Price? '"*であることを確認しましたか? - - ImplicitlyUnwrappedOptionalはもはやSwift 3の特殊タイプではありません。 http://stackoverflow.com/questions/39537177/swift-3-incorrect-string-interpolation-with-implicitly-unwrapped-optionsalsまたはhttp://stackoverflow.com/questions/39633481/implicitly-unwrapped-optional-assign- in-xcode-8である。 –

+0

私はオプションではないプロパティを使用しており、問題が解決しました。それはまだ間違いを投げているのではない、それは奇妙だよね?私はデバッガを使ってチェックしました。 ( 'print product.price') –

答えて

5

実行時に、product.priceのタイプはPriceですか?

struct Product { 
    var image: URL! // <-- Explicitly marked as optional via '!' 
} 

あなたはそれが非オプションになりたい場合は、ありません:明示的にありません、あなたが明示的にオプションようにそれを設定し

非オプションに設定していますので、私は、これは奇妙な見つけます!または?を経由して、オプションとしてマーク:

struct Product { 
    var image: URL // <-- not marked as optional 
} 

!?の両方がoptionalsです。唯一の違いは、後者を明示的にラップ解除する必要があることです(if let)。前者は自動的にラップ解除されます(誤って使用されるとクラッシュする可能性があります)。

+0

ああ私は、物事をクリアすることがわかります。ありがとう! –

1

Swift 3では、暗黙のうちにアンラップされたオプションは通常Optionalでサポートされている可能性があります。

Proposal for abolishing IUO

しかし、の登場!プロパティまたは変数宣言の型の終わりに、宣言がIUO型を持っていることをもはや示しません。むしろ、(1)宣言にオプションの型があり、(2)宣言にその値が暗黙的に強制されることを示す属性があることを示します。 (人間はこの属性を書いたり観察したりすることはできませんが、私はそれを@_autounwrappedと呼んでいます)。このような宣言は、以後IUO宣言と呼ばれます。

関連する問題