如何使用闭包编写通用 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 上使用它时它可能会在运行时崩溃.
我正在尝试为 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 上使用它时它可能会在运行时崩溃.