包含所有扩展方法的 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

上述方法的优点在于声明为静态的方法将通过静态协议 属性 可用,而实例方法通过实例协议 属性.