2016-09-21 5 views
2

iOS開発が初めてです。私はSwiftの以前のバージョンを使用しているビデオチュートリアルを見てこのプロジェクトを行っていますが、私はSwiftを使用しています。スイフト3:ラベルに設定する前にオプションで自動的にオプションのラップを解除することはできません。

私はこの問題に遭遇しました。 2つのオプションの整数は、計算に使用されるときにラップ解除されます。しかし、テキストがラベルに与えられたときにはラップされません。

ラベルにテキストが付いていて、それが機能したときに再度アンラッピングしようとしました。なぜそれは奇妙な行動ですか?

var leftNumber: Int! 
var rightNumber: Int! 

func generateProblem() { 
    leftNumber = generateRandomNumber() 
    rightNumber = generateRandomNumber() 

    // The problem is here 
    problemLabel.text = "\(leftNumber) x \(rightNumber)" 
} 

func generateRandomNumber() -> Int { 
    return Int(arc4random_uniform(UInt32(9))) + 1 
} 

シミュレータのスクリーンショット:がそれをを必要とすることが暗黙のコンテキストでアンラップすることを除いて

スウィフト3においてscreen

+0

http://stackoverflow.com/a/39584551/2303865 –

+0

文字列補間を行う前に、あなたのvarをラップする必要があります。 https://github.com/apple/swift-evolution/blob/master/proposals/0054-abolish-iuo.md ImplicitlyUnwrappedOptional型を無効にしてください。 –

+0

@LeoDabusですが、ウェブ上のチュートリアルでは '!'は自動的にアンラップされると言っています。 – Marat

答えて

2

は、暗黙的に開封されたオプションは、オプションと同じです。たとえば、func foo(i: Int)がある場合、foo(i: leftNumber)と書くことができ、コンパイラは展開処理を実行します。

文字列補間は、アンラッピングが必要なコンテキストではありません。そこにオプションのものを使うことができるので、Swiftはオプションのケースを好み、あなたのためにラップしません。

オンラインで見つかったチュートリアルは、Swift 3用に更新されていないか、誤解されている可能性があります。

+0

これは暗黙のアンラップが過去に行われたことを意味しますか?私はいつも '!'の代わりに '?'を使うべきでしょうか?コンパイラがアンラップするかどうか心配する必要はありませんか? – Marat

+0

明らかにするには、可能な限り、デフォルトでラップしないようにする必要があります。暗黙のアンラッピングは、理由や理由によって変数が常に値を持ちますが、コンパイラにそれを証明できないことを知っている場合に役立ちます。その場合、まだ定型文を取り除くのに役立ちます。明示的なラッピングは、無数のケースでは依然として有効です。 – zneak

+0

あなたのご協力に感謝します。 – Marat

関連する問題