ios swift 类符合Protocol

标签: ios Swift protocols
发布时间: 2017/4/3 23:15:34
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想学习 swift 并且想要使用Protocol面向编程方法。想要实现什么是简单但找不到任何方式。

让说,我已经是文本字段的插座。我想要那 textfield 符合像 ValidatesName Protocol的议定书。有没有任何方法去做? 我不想让新类的子类 UITextField 和符合Protocol。我想要用于此特定的属性。

@IBOutlet weak var nameTextField:UITextField!<Conforms ValidatesName>
@IBOutlet weak var emailTextField:UITextField!<Conforms ValidatesEmail>
@IBOutlet weak var passwordTextField:UITextField!<Conforms ValidatesPassword>

谢谢你

解决方法 1:

您的问题是,虽然你可以添加Protocol一致性通过扩展,到类,这个类的实例不应用扩展。 这意味着你可以这样说︰

extension UITextField: ValidatesName {...}

但这会使符合 UITextField 的所有实例ValidatesName

同样,你也可以说

extension UITextField: ValidatesEmail{...}

但现在的 UITextField 的所有实例将都符合 ValidatesName ValidatesEmail

具有分离的 Validates... Protocol似乎不是正确的做法无论如何。 您的Protocol的基本签名有点像 var isValid: Bool ; 这不会改变名称和电子邮件之间。 什么会改变是验证逻辑,并要找地方住。 这一点,再加上你需要子类使用界面生成器会表明单个Protocol 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")
    }
}
官方微信
官方QQ群
31647020