如何在 Swift 中调用 [self new]
How to invoke [self new] in Swift
这是一个用 ObjectiveC 编写的 UIView
扩展,可以轻松创建使用自动布局的视图:
+(id)autolayoutView
{
UIView *view = [self new];
view.translatesAutoresizingMaskIntoConstraints = NO;
return view;
}
它调用 [self new]
所以 UIView 的任何子类都可以使用这个方法。我怎样才能在 Swift 中做到这一点?
好的,这似乎是解决方案。该类型必须有一个带有正确参数列表的 required
初始值设定项(在本例中没有参数)。
class SubView: UIView {
override required init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
class func autolayoutView() -> UIView {
var view = self()
view.setTranslatesAutoresizingMaskIntoConstraints(false)
return view
}
}
受 Gregory Higley 的启发,我认为解决方案就在这里:
extension UIView{
class func autolayoutView() -> UIView {
var view = self()
view.setTranslatesAutoresizingMaskIntoConstraints(false)
return view
}
}
Swift2.1 更新:
extension UIView{
class func autolayoutView() -> UIView {
let view = self.init()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
}
尽管 Carrl 和 Gregory Higley 的解决方案都是正确的,包括关于 self() 需要使用必需的初始化这一事实的评论,但我想 post 一个更一般的例子:
class Human {
var gender = String()
required init() {
self.gender = "any"
}
class func newHuman() -> Human {
return self()
}
}
class Man : Human {
required init() {
super.init()
self.gender = "male"
}
}
var someMan = Man.newHuman()
println(someMan.gender) // male
这是一个用 ObjectiveC 编写的 UIView
扩展,可以轻松创建使用自动布局的视图:
+(id)autolayoutView
{
UIView *view = [self new];
view.translatesAutoresizingMaskIntoConstraints = NO;
return view;
}
它调用 [self new]
所以 UIView 的任何子类都可以使用这个方法。我怎样才能在 Swift 中做到这一点?
好的,这似乎是解决方案。该类型必须有一个带有正确参数列表的 required
初始值设定项(在本例中没有参数)。
class SubView: UIView {
override required init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
class func autolayoutView() -> UIView {
var view = self()
view.setTranslatesAutoresizingMaskIntoConstraints(false)
return view
}
}
受 Gregory Higley 的启发,我认为解决方案就在这里:
extension UIView{
class func autolayoutView() -> UIView {
var view = self()
view.setTranslatesAutoresizingMaskIntoConstraints(false)
return view
}
}
Swift2.1 更新:
extension UIView{
class func autolayoutView() -> UIView {
let view = self.init()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}
}
尽管 Carrl 和 Gregory Higley 的解决方案都是正确的,包括关于 self() 需要使用必需的初始化这一事实的评论,但我想 post 一个更一般的例子:
class Human {
var gender = String()
required init() {
self.gender = "any"
}
class func newHuman() -> Human {
return self()
}
}
class Man : Human {
required init() {
super.init()
self.gender = "male"
}
}
var someMan = Man.newHuman()
println(someMan.gender) // male