在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