私はフォーム入力ライブラリで作業しています。私の目標は、一連のフォームフィールドに適用できる再利用可能なバリデータセットを用意することです。私はジェネリックプロトコルを専門にするのが難しいです。以下のコードの完全なエラーはprotocol 'FieldValidator' can only be used as a generic constraint because it has Self or associated type requirements
です。"プロトコルXは一般的な制約としてのみ使用できます"
完全遊び場対応コード:
import Foundation
protocol FieldValidator {
associatedtype InputType: Any
func validate(input value: InputType)
}
struct EmailValidator: FieldValidator {
func validate(input value: String) {}
}
enum Field {
case string(_: [FieldValidator])
case integer(_: [FieldValidator])
}
let emailField: Field = .string([EmailValidator()])
私は
を試してみた私はそれが何を知っておく必要があるためField
列挙型で、私はちょうどFieldValidator
に投げることができないということを理解しますそれが必要とするバリデータのInputType
。
case string(_: [FieldValidator<String>])
case integer(_: [FieldValidator<Int>])
またはこの:
case string(_: [FieldValidator where InputType == String])
case integer(_: [FieldValidator where InputType == Int])
が、これらは動作しません。私はこのような何か多分、何とかそれを伝える必要があることを期待しています。このような建築を維持する方法はありますか? struct
の代わりに、フィールドタイプのためenum
を使用して
編集:protocol 'FieldValidator' can only be used as a generic constraint because it has Self or associated type requirements
:
struct StringField {
typealias InputType = String
let validators: [FieldValidator]
}
私はまだ(フィールドが初期化されたときに提供する必要があります)バリデータのセットを定義する同じ問題を抱えているように見えます。
は密な私を呼び出して、私は列挙型が_for_が何であるかを把握していませんよ。 – matt
これは、使用可能なさまざまなタイプのフィールドを定義するために選択した方法です。また、フォームフィールドに渡され、フォームフィールドから取得される値のタイプを判別するためにも使用されます。これは一連の構造体である可能性があります。struct StringField、struct IntField。 – tobygriffin
@matt私は、列挙型ではなく構造体またはクラスを使用していましたが、どちらのクラスでも運がありませんでした。より良い選択肢がありますか? – tobygriffin