0
protocol textingprotocol : class {
    func didEnterText (text:String)
}

class secondViewController: UIViewController {    
weak var delegate:textingprotocol?

@IBOutlet weak var txtField: UITextField?

@IBAction func dismissButton(sender: UIButton) {

    delegate!.didEnterText(txtField?.text) // A: doesn't work
    delegate!.didEnterText(txtField?.text!) // B: doesn't work
    delegate!.didEnterText((txtField?.text)!) // C: works

}

A:オプションの連鎖をまだ行っていないのでしょうか? テキストに値がある場合にのみ行が機能し、そうでない場合は正常に失敗しますか? それでも、次のようになります。

オプションの型「文字列?」の値 開封されていません。「!」を使用するつもりでしたか? また '?'?

B: 上記のコンパイラ エラーが発生した場合でも、ラップを解除しますが、C のようにしたいという点で満足していません。私が理解しているように、?私は txtField を!アンラップし、テキストをアンラップしましたが、なぜまだ混乱していますか?うまくいきません

Cは機能するのにBが機能しないのはなぜですか? ライン C よりもクリーンな方法はありませんか? ライン C は非常に魅力的ではないように見えます。

4

1 に答える 1

2

didEnterTextはかかりませんString?。かかりますString。したがって、疑問符を使用した単純なオプションの連鎖を使用してその引数を取得することはできません。-or-nilに暫定的にアンラップするのではなく、実際に にアンラップする必要があります。StringString?

現在txtFieldはオプションなので、ラップを解除する必要があります。

また、UITextField のtextプロパティはオプションであるため、ラップも解除する必要があります。

したがって、最も簡単なアプローチは、絶対に両方をアンラップすることです。

    delegate!.didEnterText(txtField!.text!)

それをしたくない場合 (そのうちの 1 つが nil になり、アプリがクラッシュするのではないかと恐れているため)、次のように全体を保護する必要がありますif let

    if let s = txtField?.text {
        delegate!.didEnterText(s)
    }
于 2016-09-28T20:52:08.740 に答える