2014-06-22 15 views
45

In Objective-C verwenden wir es wie diesesWie überschreiben Sie layerClass in schnellen

+ (Class)layerClass 
{ 
    return [CAEAGLLayer class]; 
} 

Offensichtlich tun wird dies nicht funktionieren:

CAEAGLLayer.class() 

Da class ein Stichwort in Swift ist. Wie machst du es in Swift?

Antwort

88

Angepasst von Apple ListerKit Beispielcode:

override class func layerClass() -> AnyClass { 
    return CAEAGLLayer.self 
} 

Update für Swift 3:

override class var layerClass: AnyClass { 
    get { 
     return CAGradientLayer.self 
    } 
} 
4

Swift macht Introspektion viel anders als Objective-C. Vielleicht möchten Sie einen Blick auf die Dokumentation über Metatypes werfen.

Für Ihren Fall würde ich versuchen: CAEAGLLayer.self

+0

Dies ist die richtige Antwort in diesem Fall, weil 'layerClass' deklariert als Rückgabe' AnyClass! ', Die ein Typ für Typen ist. Aber im Allgemeinen sind sie nicht gleich, da ein Typ kein Objekt ist, während Klassen in Objective-C Objekte sind. – newacct

+0

Ich verstehe das nicht. Ich möchte die Layer-Klasseninformationen nicht lesen. Ich möchte den Standardlayertyp von UIView überschreiben. Dies muss geschehen, bevor die UIView-Instanz nicht danach zugeordnet wird. Die Methode, die ich oben eingefügt habe, hat es in ObjC gemacht, aber ich verstehe nicht, wie man es in Swift implementiert? Diese – chunkyguy

+0

ist, was Abhilfe, die funktioniert, aber es ist nicht dasselbe 'var gradientLayer: CAGradientLayer = CAGradientLayer() layer.insertSublayer (gradientLayer, atIndex: 0)' – chunkyguy

27

In iOS 10, das ist ein berechnete Eigenschaft anstelle einer Methode:

override class var layerClass: AnyClass { 
    get { 
     return CAEAGLLayer.self 
    } 
} 
+0

Arbeiten in Swift 3, aber ich musste es erklären * offen * dh 'überschreibe offene Klasse var layerClass: AnyClass' – shelll

0

Es kann wie dieser

import UIKit 

class GradientView: UIView { 

    override final class var layerClass: AnyClass { 
     return CAGradientLayer.self 
    } 
} 

Bonus-Tipp geschrieben werden: Vielleicht möchten Sie eine Art sicheren Getter zur Schicht haben mögen? Dann können Sie schreiben

import UIKit 

class GradientView: UIView { 

    override final class var layerClass: AnyClass { 
     return CAGradientLayer.self 
    } 

    override var layer: CAGradientLayer { 
     return super.layer as! CAGradientLayer 
    } 

} 
+0

Der Grund, warum ich den bang'! 'verwende, ist, weil dies von objective-c garantiert wird, um konsistent zu sein. – hfossli