【发布时间】:2019-10-21 06:25:31
【问题描述】:
我正在尝试为 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 的所有子类都具有此功能,因此我尝试实现上述“新”功能的通用版本。到目前为止,我想出了这个:
extension NSObject {
class func new(_ initialization: (inout Self) -> Void) -> Self {
var newSelf = Self()
initialization(&newSelf)
return newSelf
}
}
但这会产生以下错误: 'Self' 仅在协议中可用或作为类中方法的结果;你的意思是“NSObject”吗?
我正在使用 Swift 5.1(Xcode 11 beta)的操场上尝试这个。
【问题讨论】:
-
这行不通,因为
NSObject的子类可以将init方法标记为NS_UNAVAILABLE。因此,仅仅因为您有一个扩展NSObject的类的元类型对象,并不意味着您可以构造该类型的新对象。 -
那么只为 UIView 子类做呢?这可能吗?
-
我会考虑只定义类似
func with<T>(_ x: T, body: (inout T) throws -> Void) rethrows -> T { var x = x; try body(&x); return x }的东西。然后你可以说let label = with(UILabel()) { ... }。然后,您还可以灵活地使用所需的任何初始化程序。
标签: swift generics self initializer