如何使用闭包编写通用 Swift class 函数来初始化 classes?

How to write a generic Swift class function to initialize classes using a closure?

我正在尝试为 Swift classes 编写一个通用的 class 函数,它允许我使用尾随闭包语法初始化 classes。

我已经让它适用于特定的 classes,例如 UILabel。

// Extension for UILabel
extension UILabel {
    class func new(_ initialization: (inout UILabel) -> Void) -> UILabel {
        var label = UILabel()
        initialization(&label)
        return label
    }
}

// Initialize new UILabel using trailing closure syntax and "new" function
let label = UILabel.new {
    [=12=].textColor = .red
}

但是,我想为 NSObject 的所有子 class 提供此功能,因此我正在尝试实现上述 "new" 函数的通用版本。到目前为止,我想出了这个:

extension NSObject {
    class func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

但这会产生以下错误:'Self' 仅在协议中可用或作为 class 中方法的结果;你是说 'NSObject'?

我正在 Swift 5.1(Xcode 11 beta)的操场上尝试这个。

正如 Hamish 所说,也许最好将 init 留在外面,这样更灵活。然而,可能有一种使用协议的解决方法。

protocol Initializable {
    init()
}

extension Initializable {
    static func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

extension NSObject: Initializable {}

NSObject 已经有一个 init,所以它自动符合 Initializable。 然后把你的扩展写在协议上。

唯一需要注意的是,您现在不能使用 class 修饰符,因为您处于 protocol.

不确定这是否会导致 NS_UNAVAILABLE 修饰符出现问题,我认为当您在隐藏 init 的 class 上使用它时它可能会在运行时崩溃.