我正在尝试为 Swift 类编写一个通用类函数,它允许我使用尾随闭包语法来初始化类。
我已经让它适用于特定类,例如 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 {
$0.textColor = .red
}
但是,我想为 NSObject 的所有子类都提供此功能,因此我正在尝试实现上面"new"函数的通用版本。到目前为止,我想出了这个:
extension NSObject {
class func new(_ initialization: (inout Self) -> Void) -> Self {
var newSelf = Self()
initialization(&newSelf)
return newSelf
}
}
但这会产生以下错误:'Self' 仅在协议(protocol)中可用或作为类中方法的结果可用;您是指“NSObject”吗?
我正在使用 Swift 5.1(Xcode 11 测试版)在 Playground 上进行尝试。
最佳答案
正如 Hamish 所说,也许最好将 init 留在外面,这样更灵活。然而,可能有一种使用协议(protocol)的解决方法。
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
。
然后在协议(protocol)上写下你的扩展。
唯一要注意的是,您现在不能使用 class
修饰符,因为您在 protocol
中。
不确定这是否会导致 NS_UNAVAILABLE
修饰符出现问题,我认为当您在隐藏 init 的类上使用它时它可能会在运行时崩溃。
关于swift - 如何编写一个通用的 Swift 类函数来使用闭包初始化类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465632/