2016-08-08 10 views
4

Nehmen Sie diesen Code:Wie vermeidet man die Verwendung von A.self?

protocol P: class { 
static var hello: String { get } 
} 

class A: P { 
    class var hello: String { 
     return "Hello" 
    } 
} 

class B: A { 
    override static var hello: String { 
     return "Hello World" 
    } 
} 

class C: A {} 

class D: C { 
    override static var hello: String { 
     return "Hello D" 
    } 
} 

func sayHello(elements: P.Type...) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

func sayHelloAgain(elements: A.Type...) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

func sayHelloThe3rd(elements: [A.Type]) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

sayHello(A.self, B.self, C.self) 
sayHelloAgain(A.self, B.self, C.self) 

Vergleichen sie dies (aus diesem presentation genommen)

func register<T: UITableViewCell where T: ReusableView, T: NibLoadableView>(_: T.Type) { ... } 
tableView.register(FoodTableViewCell) 

Warum muss ich A.self in einem Fall verwendet werden, aber nicht in der anderen? Und auch, müssen nicht verwenden .self beim Aufruf mit einem Argument.

sayHello(A) 
sayHello(A, B) //doesn't compile 
+2

Der ältere Code, auf den Sie verweisen, generiert nun eine Warnung, dass Sie '.self' hinzufügen sollten. Es gab Fälle in früheren Versionen von Swift, in denen das '.self' erraten werden konnte und der Compiler es einstecken würde, aber Swift bewegt sich immer dazu, es immer zu benötigen, wie Alexander unten feststellt. –

Antwort

2

Die .self ist syntaktisches Salz. Es ist nicht notwendig, aus technischer Sicht, aber es gibt Fehler im Code zu verursachen, die oft ist das Ergebnis eines Tippfehler, wie zum Beispiel:

struct Foo { } 

let foo = Foo 

Dieser Code wird Ihnen einen Compiler-Fehler, die besagt, dass entweder Sie müssen Vervollständigen Sie den Initialisierungs-/Funktions-/Methodenaufruf oder fügen Sie .self an, wenn Sie sich auf den Typ beziehen wollten.

Im letzteren Beispiel behandelt der Kontext ausschließlich Typen und keine Werte, so dass es keine Möglichkeit gibt, eine mit der anderen zu verwechseln. Daher ist .self nicht erforderlich.

Vielleicht gibt es eine Möglichkeit, die Funktionsdeklaration in Ihrem Beispiel zu ändern, so dass die .self nicht erforderlich ist, aber ich bin mir einer solchen Funktion nicht bewusst. Ich wäre daran interessiert, es herauszufinden.

+0

War der Begriff syntaktisches Salz nicht bekannt. –

+0

@LescaiIonel Ja, die meisten Sprachen haben sie. Zum Beispiel benötigt Swift das Schlüsselwort 'fallthrough' in switch-Anweisungen, um versehentliche implizite Abstürze zu vermeiden. 'var' ist auch syntaktisches Salz, um Benutzer über potentiell unerwünschte Mutationen zu informieren, aber es macht auch Code-Absicht klarer. – Alexander

Verwandte Themen