包含所有扩展方法的 Swift 模块
A Swift module that contains all extension methods
就个人而言,我更喜欢 Swift 中带有前缀的扩展方法。乍一看,更容易猜测一个函数是来自原始 class 还是来自扩展。此外,它使框架在其他项目中更具可重用性。我们不需要搜索框架方法所属的命名空间。但是,为扩展中的所有实例和静态方法添加前缀有点详尽无遗。出于这个原因,我想创建一个包含所有扩展方法的模块,无论是实例还是静态。
我看过 this implementation,很喜欢它,但不幸的是它只适用于实例方法:
public protocol MyHelperCompatible {
associatedtype someType
var my: someType { get }
}
public extension MyHelperCompatible {
public var my: MyHelper<Self> {
get { return MyHelper(self) }
}
}
public struct MyHelper<Base> {
let base: Base
init(_ base: Base) {
self.base = base
}
}
// All conformance here
extension UIColor: MyHelperCompatible { }
使用它,我们可以按如下方式访问实例方法:
let redImage = UIColor.red.my.toImage()
您是否知道应用类似逻辑来添加模块以处理实例和静态方法的方法? (例如,UIColor.my.staticMethod()
)对于这个问题,您建议使用什么方式?
受 RxSwift 继续采用的方法的启发,这是一个提供对 my
扩展的实例和静态成员的访问的解决方案。
首先,让我们声明扩展的基础:
struct MyExtension<Target> {
let target: Target
init(_ target: Target) {
self.target = target
}
}
让我们允许类型符合:
protocol MyExtensionCompatible { }
extension MyExtensionCompatible {
// instance extension
var my: MyExtension<Self> { return MyExtension(self) }
// static extension
static var my: MyExtension<Self>.Type { return MyExtension<Self>.self }
}
现在开始播放并添加 UIColor
一致性:
extension UIColor: MyExtensionCompatible { }
extension MyExtension where Target == UIColor {
static var customColor: UIColor { return UIColor.blue }
func toImage() -> UIImage {
return UIImage()
}
}
最后,让我们使用上面创建的所有内容:
// the static property
let color = UIColor.my.customColor
// the instance function
let colorImage = color.my.toImage()
// foldoesn't compile, compile, we haven't declared UILabel as compatible
let color2 = UILabel.my
上述方法的优点在于声明为静态的方法将通过静态协议 属性 可用,而实例方法通过实例协议 属性.
就个人而言,我更喜欢 Swift 中带有前缀的扩展方法。乍一看,更容易猜测一个函数是来自原始 class 还是来自扩展。此外,它使框架在其他项目中更具可重用性。我们不需要搜索框架方法所属的命名空间。但是,为扩展中的所有实例和静态方法添加前缀有点详尽无遗。出于这个原因,我想创建一个包含所有扩展方法的模块,无论是实例还是静态。
我看过 this implementation,很喜欢它,但不幸的是它只适用于实例方法:
public protocol MyHelperCompatible {
associatedtype someType
var my: someType { get }
}
public extension MyHelperCompatible {
public var my: MyHelper<Self> {
get { return MyHelper(self) }
}
}
public struct MyHelper<Base> {
let base: Base
init(_ base: Base) {
self.base = base
}
}
// All conformance here
extension UIColor: MyHelperCompatible { }
使用它,我们可以按如下方式访问实例方法:
let redImage = UIColor.red.my.toImage()
您是否知道应用类似逻辑来添加模块以处理实例和静态方法的方法? (例如,UIColor.my.staticMethod()
)对于这个问题,您建议使用什么方式?
受 RxSwift 继续采用的方法的启发,这是一个提供对 my
扩展的实例和静态成员的访问的解决方案。
首先,让我们声明扩展的基础:
struct MyExtension<Target> {
let target: Target
init(_ target: Target) {
self.target = target
}
}
让我们允许类型符合:
protocol MyExtensionCompatible { }
extension MyExtensionCompatible {
// instance extension
var my: MyExtension<Self> { return MyExtension(self) }
// static extension
static var my: MyExtension<Self>.Type { return MyExtension<Self>.self }
}
现在开始播放并添加 UIColor
一致性:
extension UIColor: MyExtensionCompatible { }
extension MyExtension where Target == UIColor {
static var customColor: UIColor { return UIColor.blue }
func toImage() -> UIImage {
return UIImage()
}
}
最后,让我们使用上面创建的所有内容:
// the static property
let color = UIColor.my.customColor
// the instance function
let colorImage = color.my.toImage()
// foldoesn't compile, compile, we haven't declared UILabel as compatible
let color2 = UILabel.my
上述方法的优点在于声明为静态的方法将通过静态协议 属性 可用,而实例方法通过实例协议 属性.