2015-02-08 29 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