0

私は Swift 2 を使用して、このプロトコル指向プログラミングのクールさに追いつこうとしていますが、現在はかなり迷っています。

私は理論を実際のユースケースに適用しようとしているので、最も明白なものから始めましょう:

私が を持っていて、目的の動作を達成するためにメソッドに準拠してオーバーライドするUITextField多くのプロトコル (電話、数値、長さ制限など) を持ちたいとしましょう。UITextFieldDelegatetextField:shouldChangeCharactersInRange:replacementString

「Extensions.swift」ファイルにこの拡張子を付けて、目的のプロトコルをUITextField(数値、長さ制限など) に割り当てることさえ可能ですか? それは非常に便利です。もしそうなら、プロトコルをUITextFieldコンセントに割り当てる方法はありますか、それとも a をサブクラス化しUITextFieldて目的のプロトコルに準拠させる必要がありますか? この場合、古き良きサブクラス化よりもプロトコル拡張を使用する利点があまりないと思います。

4

1 に答える 1

5

あなたが説明しているケースは、プロトコルや拡張機能としてあまり意味がありません。クラスの特定のインスタンスに拡張機能を適用することは絶対にできません。

これを実装する 2 つの方法は、継承 (サブクラス化) または合成 (ヘルパー) です。おそらく理解できるサブクラス化。ヘルパーを作成するには、必要な関数を記述して再利用するだけです。

func numericTextField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    // The code you'd want for numerics
}

そして、その共有コードを実際のデリゲートの から呼び出すだけですtextField(_:shouldChangeCharactersInRange:replacementString:)

func textField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return numericTextField(textField, shouldChangeCharactersInRange: range, replacementString: String)
}

もちろん、これらすべてのパラメーターが本当に必要ない場合は、関数の署名を単純化することを選択できます。

一般に、コンポジションはより柔軟なアプローチです。いくつかの関数を作成して呼び出すだけです。

拡張機能とプロトコルは強力で重要なツールです。それらはこの問題とは関係ありません。

于 2015-12-10T21:36:06.640 に答える