2015-03-01 7 views
20

In einer aktuellen Frage hatte das Plakat dieses interessante Codezeile:Aufruf einer Factory-Methode der Swift-Klasse mit führender Punktnotation?

self.view.backgroundColor = .whiteColor() 

Ich war überrascht, das zu sehen. Ich habe nur die führende Punkt Notation für Enum-Werte verwendet. In diesem Fall ist backgroundColor vom Typ UIColor? und whiteColor ist eine Klassenmethode unter UIColor, die eine UIColor zurückgibt.

Warum funktioniert das? Ist das ein legitimer Weg, eine Fabrikmethode zu nennen?

Antwort

24

Diese FunktionImplicit Member Expression

Ein implizites Mitglied Ausdruck genannt wird, ist ein abgekürzter Weg, um ein Mitglied einer Art zuzugreifen, wie eine Enumerationsfall oder eine Klassenmethode in einem Kontext, in dem Typinferenz den impliziten Typ bestimmen kann. Er hat die folgende Form:

.Mitgliedsnamen


Aber ab jetzt, rate ich Ihnen sollte nicht Verwendung dieses Feature in Optional oder ImplicitlyUnwrappedOptional Kontext .

Obwohl dies funktioniert:

// store in Optional variable 
let col: UIColor? 
col = .redColor() 

// pass to function 
func f(arg:UIColor?) { println(arg) } 
f(.redColor()) 

Dieser den Compiler stürzt :(

func f(arg:UIColor?, arg2:Int) { println(arg) } 
//     ^^^^^^^^^^ just added this. 
f(.redColor(), 1) 

Der Compiler einige Fehler hat sehen. does swift not allow initialization in function parameters?

+1

Es sollte beachtet werden, dass zumindest in Swift 3.2, das letzte Beispiel stürzt _nicht_ den Compiler und tatsächlich (nach dem Einfügen der ausgelassenen Argument Labels) läuft gut. –

9

Sieht aus wie die Regel: Wenn ein Typ eine statische Methode, die diese Art zurückgibt, können Sie den Typ des Namens überspringen, wenn der Rückgabetyp bereits bestimmt:

struct S { 
    static func staticmethod() -> S { 
     return S() 
    } 
    static var staticproperty: S { 
     return S() 
    } 
} 

let s1: S = .staticmethod() 
let s2: S = .staticproperty 

Ich frage mich, ob dies beabsichtigt ist, oder ein Nebeneffekt der Umsetzung von Aufzählungen, die diese Funktion gegeben, vielleicht gedacht als für so etwas wie diese syntaktischen Zucker werden könnte:

struct FakeEnum { 
    let raw: Int 
    static var FirstCase: FakeEnum { return FakeEnum(raw: 0) } 
    static var SecondCase: FakeEnum { return FakeEnum(raw: 1) } 
} 

let e: FakeEnum = .FirstCase 
4

ich kann nichts entlang der Linien in der Dokumentation. Ich glaube jedoch, dass Swift weiß, welcher Typ von self.view.backgroundColor im Kontext ist, daher sollte Ausdruck, der direkt mit einem Punkt beginnt, eine statische für diesen Typ sein (entweder eine statische Methode oder eine statische Eigenschaft).

Folgende Arbeiten schön:

struct Foo { 
    static func fooMethod() -> Foo { 
     return Foo() 
    } 

    static var fooProperty: Foo = Foo() 
} 

var foo: Foo 

foo = .fooMethod() 

foo = .fooProperty 
Verwandte Themen