2015-02-08 24 views
6

这里[个体经营新]是一个UIView扩展写成的ObjectiveC方便地使用自动布局创建视图:如何调用斯威夫特

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

它调用[self new]这样的UIView的任何子类可以使用此方法。我如何在Swift中实现这一点?

+0

将它写成objC中的UIView类别,并将它桥接到swift? swift并不是真正意义上的那种动态 – 2015-02-08 12:53:50

回答

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

您能否展示更详细的代码:) – duan 2015-02-08 13:07:52

+0

与ObjC相比,这非常笨重。我真的希望Swift像ObjC一样是一个完全动态的语言,只是语法更清晰。像F-Script或nu。 – 2015-02-08 13:30:33

+0

是的,'self()'确实有效。但是你不需要做子类。看到我的答案。 – duan 2015-02-08 13:34:55

1

格雷戈里希格利启发,我认为解决的办法是在这里:

为Swift2.1
extension UIView{ 
    class func autolayoutView() -> UIView { 
     var view = self() 
     view.setTranslatesAutoresizingMaskIntoConstraints(false) 
     return view 
    } 
} 

更新:

extension UIView{ 
    class func autolayoutView() -> UIView { 
     let view = self.init() 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    } 
} 
+0

啊,是的。我错过了你所说的“UIView扩展”的部分。 – 2015-02-08 13:44:15

1

虽然Carrl和Gregory希格利都是用权有解决方案,其中包括关于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 
+0

这与我在游乐场实验中使用的代码几乎完全相同,只是我使用了不太富有想象力的'Foo'和'Bar'。 – 2015-02-08 14:17:21