我正在處理表單輸入庫。我的目標是擁有一組可用於一組表單域的驗證器。我遇到了困難,專注於我的通用協議。下面的代碼完整的錯誤是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
爲字段類型:
struct StringField {
typealias InputType = String
let validators: [FieldValidator]
}
我仍然看起來具有定義所述一組驗證器(當字段被初始化必須提供)同樣的問題:protocol 'FieldValidator' can only be used as a generic constraint because it has Self or associated type requirements
。
給我打電話密集,但我沒有把握枚舉是_for_什麼。 – matt
這只是我選擇定義不同類型的可用字段的方式。它也用於確定傳入和從表單字段檢索的值的類型。它可以是一系列的結構,我猜想:struct StringField,struct IntField。 – tobygriffin
@matt我有一個使用結構或類而不是一個枚舉的快速去,但我沒有運氣與任何一個。有更好的選擇嗎? – tobygriffin