我想创建一个Validatable
协议,它有两个属性:一个validator
和一个isAbleToProceed
布尔值:
protocol Validatable {
var validator: Validator { get set }
var isAbleToProceed: Bool { get set }
}
我想定义不同类型的Validators
(出生日期验证器,电子邮件验证器等)。为此,我创建了一个工厂:
protocol Validator {}
struct ValidatorFactory {
internal static let sharedInstance = ValidatorFactory()
func dateOfBirthValidator(minimumAge: Int, maximumAge: Int) -> DateOfBirthValidator {
return DateOfBirthValidator(minimumAge: minimumAge, maximumAge: maximumAge)
}
func driversLicenseValidator(minLicenseDuration: Int) -> DriversLicenseValidator {
return DriversLicenseValidator(minLicenseDuration: minLicenseDuration)
}
}
这是DateOfBirthValidator的实现:
struct DateOfBirthValidator: Validator {
let minimumAge: Int
let maximumAge: Int
func isDateOfBirthValid(date: Date) -> Bool {
if let age = Calendar.current.dateComponents([.year], from: date, to: Date()).year {
return (minimumAge ... maximumAge).contains(age)
} else {
return false
}
}
}
然后我会有一个类ViewController,实现Validatable协议:
class ViewController: Validatable {
// MARK: Internal Properties
internal var validator: DriversLicenseValidator
internal var isAbleToProceed: Bool = false
}
但编译器会报告ViewController不符合
Validatable
(没有Validator)
如果我使Validator
成为超类并且所有验证器结构变成类并从中继承,则可以解决这个问题。但有没有办法让它与结构和协议一起工作?