2017-01-13 6 views
2

Ich versuche Funktion zu implementieren, die einfacher Name Werttyp zurückgibt:Swift-Typ (von :) Funktion Unterschrift

func typeName(of value: Any) -> String { 
    return String(describing: type(of:value)) 
} 

Aber wenn ich versuche es vor super.init Anruf zu nennen:

class SuperTest { 
    init(name: String) { 
     print(name) 
    } 
} 

class Test: SuperTest { 
    init() { 
//  super.init(name: String(describing: type(of: self))) 
     super.init(name: typeName(of: self)) 
    } 
} 


Test() 

es irgendwie:

'selbst' verwendet, bevor super.init Aufruf

was mir völlig klar ist.

Aber wenn ich inline typeName(of:) body code (kommentierte Zeile) dann kompiliert und druckt erwartet "Test" Ergebnis.

Warum passiert diese Magie und wie kann ich typeName(of:) vor super.init() wie type(of:) verwenden?

Auch ich kann keine Informationen (Funktionssignatur) finden über type(of:) in Swift docs oder source code.

+0

Wenn Sie 'typeName' statisch machen (wie es logisch sinnvoll zu sein), werden Sie dieses Problem nicht bekommen. – Alexander

+0

Es ist bereits im globalen Umfang definiert. Wie kann ich es statischer machen? – mixel

+0

Oh, ich dachte, es wäre eine Instanzmethode. Warte, du kannst kein Global vor dem Superinitialisierer aufrufen? "Ja wirklich?" : o – Alexander

Antwort

3

Auch wenn es aussieht type(of:) ist keine Funktion, es wird statisch vom Compiler als Dynamic Type Expression behandelt. Aus diesem Grund können Sie es vor dem Aufruf von super.init verwenden.

Mit Ihrer benutzerdefinierten Funktion weiß der Compiler nicht, dass Sie den Wert nicht tatsächlich verwenden, so dass der Aufruf nicht zugelassen werden kann.

+0

Haben Sie eine Dokumentation zu 'type (of:)' gefunden? – mixel

1

Auch ich kann keine Informationen (Funktionssignatur) finden über type(of:)

Weil es nicht eine Funktion der Standardbibliothek definiert ist. Es ist ein Grundelement, d.h. es ist ein Teil der Sprache. Da die ursprüngliche Release Notes ausdrückte:

eine neue primitive Funktion type(of:) hat die Sprache [Hervorhebung von mir]

Sie es als Betreiber denken könnte fast hinzugefügt. (Das war tatsächlich der springende Punkt seiner Erstellung, wie in der ursprünglichen proposal vorgeschlagen.)

Verwandte Themen