Swift中的扩展为现有类添加新功能, structure, enumeration, or protocol type. 这包括扩展类型的能力,即使您无法访问原始源代码, 这也被称为追溯建模. 扩展类似于Objective-C中的类别. 然而,与Objective-C的类别不同,Swift扩展没有名称. 你可以阅读更多关于 官方文档中的扩展.
As described, 扩展是一个强大的特性,我们也可以使用它使我们的代码更具可读性和更好的组织性, 反过来,这将使我们的代码更易于维护.
因此,关于何时使用扩展是有利的,这里有两个技巧.
For one thing, 在遵循协议的情况下使用扩展将使协议方法和其他代码之间的代码清晰分离. 例如,我们可以使用扩展来分离属于 UITextFieldDelegate
协议的实现:
类MyViewController: UIViewController, UITextFieldDelegate {
重载函数viewDidLoad() {
..
}
覆盖函数viewWillAppear(_动画:Bool) {
..
}
函数textFieldDidBeginEditing(textField: UITextField) {
...
}
func setupView() {
...
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
...
}
函数bindViewModel() {
...
}
}
如示例所示, 没有延期, 我们很难找到协议中所有的方法. 有了扩展,我们就有了清晰的职责分离,如下所示.
类MyViewController: UIViewController {
重载函数viewDidLoad() {
..
}
覆盖函数viewWillAppear(_动画:Bool) {
..
}
func setupView() {
...
}
函数bindViewModel() {
...
}
}
扩展MyViewController: UITextFieldDelegate {
函数textFieldDidBeginEditing(textField: UITextField) {
...
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
...
}
}
扩展的另一个有价值的用途是将负责某些公共任务或功能的某些方法组合在一起.g.(动画或验证).
Without extensions, 我们可能很难找到正确的方法, 代码很快就会变得一团糟. 首先,考虑一个例子 without 使用扩展对方法进行分组:
类MyViewController: UIViewController {
重载函数viewDidLoad() {
...
}
函数animateSaveButton() {
...
}
func validatePersonalInfo() -> Bool {
...
}
func validatePaymentInfo() -> Bool {
...
}
函数animateCustomActivityIndicator() {
...
}
}
相反,如果我们使用扩展,我们的代码会更清晰,更容易导航:
类MyViewController: UIViewController {
...
}
//标记:-动画方法
扩展MyViewController {
函数animateSaveButton() {
...
}
函数animateCustomActivityIndicator() {
...
}
}
//标记:-验证方法
扩展MyViewController {
func validatePersonalInfo() -> Bool {
...
}
func validatePaymentInfo() -> Bool {
...
}
}
最后提示:如果扩展包含大量代码, 考虑将该扩展分离为一个单独的 .swift
file.