2015-02-08 16 views
6

Oto UIView rozszerzenie napisany w ObjectiveC łatwe tworzenie widoku za korzystanie Auto-układ:Jak wywołać [self nowy] w Swift

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

wywołuje [self new] więc każda podklasa UIView można użyć tej metody. Jak mogę to osiągnąć w Swift?

+0

napisać kategorię UIView w programie objC i połączyć ją z szybką? swift nie jest tak naprawdę dynamiczny. –

Odpowiedz

5

OK, to wydaje się być rozwiązaniem. Typ musi mieć inicjator required z poprawną listą parametrów (w tym przypadku brak parametrów).

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

Czy mógłbyś pokazać bardziej szczegółowy kod:) – duan

+0

W porównaniu ze sposobem ObjC, jest to dość niezgrabne. Naprawdę chciałbym, aby Swift był w pełni dynamicznym językiem, takim jak ObjC, tylko z czystszą składnią. Coś jak F-Script lub nu. –

+0

Tak, 'self()' działa. Ale nie musisz robić podklasy. Zobacz moją odpowiedź. – duan

1

Zainspirowany Gregory Higley, myślę, że rozwiązaniem jest tutaj:

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

Aktualizacja Swift2.1:

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

Ah, tak. Brakowało mi części, w której powiedziałeś "rozszerzenie UIView". –

1

Choć zarówno Carrl i Gregory Higley rację z tam rozwiązania, w tym uwaga thr o tym, że self() potrzebuje użyć wymaganego init chciałem opublikować bardziej ogólny przykład:

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

To prawie dokładnie ten sam kod, którego użyłem w eksperymencie na placu zabaw, z tą różnicą, że użyłem mniej pomysłowego 'Foo' i' Bar'. –

Powiązane problemy