如何在Swift中调用[self new]

时间:2015-02-08 12:23:15

标签: objective-c swift uiview

这是在ObjectiveC中编写的UIView扩展,可以轻松创建使用自动布局的视图:

+(id)autolayoutView
{
    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    return view;
}

它调用[self new],因此UIView的任何子类都可以使用此方法。我怎样才能在Swift中实现这个目标?

3 个答案:

答案 0 :(得分:5)

好的,这似乎是解决方案。该类型必须具有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
    }
}

答案 1 :(得分:1)

受格雷戈里·希格利的启发,我认为解决方案就在这里:

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
    }
}

答案 2 :(得分:1)

尽管Carrl和Gregory Higley都有正确的解决方案,包括关于self()需要使用所需init的事实,我想发布一个更一般的例子:

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