Проблема заключается в том, что, хотя вы можете добавить соответствие протокола через расширение, расширение применяется к классу, а не к экземпляру этого класса. Это означает, что вы можете сказать что-то вроде:
extension UITextField: ValidatesName {...}
Но это сделает все экземпляры UITextField соответствуют ValidatesName
Кроме того, вы могли бы также сказать
extension UITextField: ValidatesEmail{...}
Но теперь все экземпляры UITextField будут соответствовать ValidatesName
иValidatesEmail
.
Имея отдельные протоколы Validates...
, в любом случае не похоже на правильный подход. Основная сигнатура вашего протокола - это что-то вроде var isValid: Bool
; это не изменяется между именем и электронной почтой. Что такое изменение логики проверки, и это должно где-то жить. Это, в сочетании с тем, что вам нужны подклассы для работы с Interface Builder, предполагает, что один протокол Validatable
, который может быть принят вашими различными подклассами, является более разумным подходом.
protocol Validatable {
var isValid: Bool { get }
}
Теперь вы можете определить подклассы UITextField, которые соответствуют этому протоколу (Вы можете добавить соответствие с помощью расширения для подкласса, если вы хотите, я просто хотел, чтобы сэкономить место здесь)
class NameTextField: UITextField, Validatable {
var isValid: Bool {
get {
guard let text = self.text else {
return false
}
return !text.isEmpty
}
}
}
class EmailTextField: UITextField, Validatable {
var isValid: Bool {
get {
guard let text = self.text else {
return false
}
return text.contains("@")
}
}
}
Теперь вы можете добавить текстовые поля в массив, и есть что-то вроде:
@IBOutlet weak var nameTextField:NameTextField!
@IBOutlet weak var emailTextField:EmailTextField!
var validatableFields:[Validatable]!
override func viewDidLoad() {
super.viewDidLoad()
self.validatableFields = [nameTextField,emailTextField]
}
...
for field in validateableFields {
if !field.isValid() {
print("A field isn't valid")
}
}
Но проблема в том, что UITextField класс не соответствует нужного протокола, принятие протокола на основе внедрения O f методы и свойства, определенные в протоколе –
Если я правильно понял, я уже могу определить некоторый метод, подобный этому. Я думал, что могу сделать это для переменной.> –
kekkeme