我正在尝试为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 (Xcode11测试版)的游乐场进行尝试。
发布于 2019-06-06 03:17:43
正如Hamish所说,也许把初始化放在外面更好,这样更灵活。但是,可以使用协议来解决此问题。
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.的类上使用它时,它可能会在运行时崩溃。
https://stackoverflow.com/questions/56465632
复制相似问题