在Swift中优雅的使用extension?

遵守代理或者数据源的时候使用extension

可以清晰的分割业务于功能。
建议每遵循一个协议另起一个extesion,再加上//MARK: 代码更加直观。

class viewController: UIViewController {

}
extension viewController: UITableViewDelegate {

}
extension viewControlelr: UITableViewDataSource {

}

不同的业务使用extension

分割控制器中不同的业务逻辑。

// MARK:request
extension viewController {

}
// MARK:method
extension viewController {

}
// MARK:setupUI
extension viewController {

}

私有API与对外API使用extension

通过加上关键字对私有API和公开的API的分离。

//  MARK:fileprivate
fileprivate extension TempTool {

}
//  MARK:open
open extension TempTool {

}

protocol 和 extension 配合

public protocol URLConvertible {
    func asURL() throws -> URL
}
extension String: URLConvertible {
    public func asURL() throws -> URL {
        guard let url = URL(string: self) else {
            throw AFError.invalidURL(url: self)
        }
        return url
    }
}
extension URL: URLConvertible {
    public func asURL() throws -> URL {
        return self
    }
}
extension URLComponents: URLConvertible {
    public func asURL() throws -> URL {
        guard let url = url else {
            throw AFError.invalidURL(url: self)
        }
        return url        
    }
}

如上所示,三个类都实现了 URLConvertible 协议,在别的地方使用的时候,就可以将参数类型定义为URLConvertible,可以传入所有符合协议的类型。

注意事项

1、class 类型的 extension 不可以定义存储属性,不可以写指定构造函数和析构函数。struct 的extension 则可以写构造函数。
2、class 类型的 extension 可以写便利构造函数。
3、如果一定要定义存储属性,请使用NSObject+runtime