2016-05-17 11 views
0

Heys guysSwift 2.2:オプションの関数でバインドする

私はプログラミングにはかなり新しいので、私はSwift 2.2を教えるためにUdemyのコースに従ってきました。

学習目的のために、テキストフィールド(ちょうど値を表示する)と私が体重をkgで入力できるスライダーがあるBMI計算機をプログラムしようとしています。スライダーをドラッグすると、その値がテキストフィールドに表示されます。テキストフィールドに値を入れてスライダに表示することはできません!

同じテキストフィールドとスライダの関係が、高さcmで使用されています。今、私は私のkgField.textに私kgSlider.valueを持っIBActionを作成し、それは次のようになります。

@IBAction func kgSet(sender: AnyObject) { 

    kgField.text! = String(Int(kgSlider.value)) 
} 

ザッツが正常に動作しますが、そこが本当にあるならば、私は、知らずに(コース内の教師のような)アンラップ価値。さて、この場合は値があることはわかりますが、もっと実際に行きたいので、直接バインドを解除する代わりに値がある場合は、オプションバインドを使用して調べようとしました。

私はcm.Fieldとcm.Sliderをコードで使用しましたが、現在は機能しません。その理由はわかりません。

@IBAction func cmSet(sender: AnyObject) { 

    if let tempCm = String(Int(cmSlider.value)) as String! { 

     cmField.text = tempCm 

    } 
} 

だから私は価値がある場合は、cmSliderから値を得ますtempCMと呼ばれる定数を作成しました:コードは次のようです。したがって、他のIBActionのようなcmSlider.valueをIntにキャストしてからStringにキャストしました。値がある場合は、それをcmField.textに持ち込みます。これはうまくいきませんでした。したがって、 "as String!"を使用しようとしました。私は常に正しい値の代わりに0になることを知っている。

私は何を間違えているのですか?

+0

なぜこれを使用しないのですか? @IBAction func kgSet(送信者:AnyObject){ kgField.text = String(Int(kgSlider.value)) } 基本的に、アンラップするものがある場合はオプションのラップを解除する必要があります。スライダーの値はオプションではありません(UISliderについて言えば)。その場合は、何も展開しないので、letの構文を使用する必要はありません。 –

+0

また、割り当ての左側に力のアンラッピングを作成する(このように:kgField.text!= ...)は意味をなさないので、そうしないでください。あなたが確かでない場合は、コンパイラの助けを借りて、何かをアンラップすることを忘れた場合、それは常に不平を言う。 –

+0

@invisible_hand:大きな助けをいただきありがとうございます!私は割り当てのリフト側でアンラッピングを使用することについて決して考えなかった。先生は!右側にテキストフィールドのアンラッピングを行います(kgValue = Int(kgField.text!))。それで、私はそれをもう一度解くのは理にかなっていると思っていましたが、あなたが正しいので、割当ての左側でそれをするのは意味がありません! – Ari

答えて

1

このように、コンパイルして結果を得ることができます。

@IBAction func cmSet(sender: AnyObject) { 

    if let tempCm = String(Int(cmSlider.value)) { 

     cmField.text = tempCm 

    } 
} 

あなたはまた、第二の例では、この

cmField.text = String(Int(cmSlider.value)) ?? " " 

を試みることができる、あなたは、その後のIntにこれを変換することができるかどうかと言って、オプションの演算子を使用しているcmField設定した文字列へのInt。それ以外の場合は空白をデフォルト値として使用します。

+0

ご協力ありがとうございます!私はあなたの最初の提案を試みたが、それは常に私にエラーを与えた。したがって、私はあなたの2番目の提案を試み、それは働いた。私も自分で問題を解決しようとしていて、以下のコードを書いています。これは動作するようです:cmField.text = String(Int(cmSlider.value)) – Ari

関連する問題