Я хочу создать протокол 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
суперклассом, и все структуры валидаторов превратятся в классы и наследуются от него. Но есть ли способ заставить его работать со структурами и протоколами?