2015-03-01 9 views
20

W ostatnim pytaniu plakat miał ciekawe wiersz kodu:Wywołanie metody fabularnej Swift z wiodącą notacją kropkową?

self.view.backgroundColor = .whiteColor() 

Byłem zaskoczony, aby zobaczyć. Wcześniej widziałem tylko notację wiodącą kropkę używaną do wyliczania wartości. W tym przypadku backgroundColor jest typu UIColor? i whiteColor jest metodą klasy na UIColor, która zwraca UIColor.

Dlaczego to działa? Czy jest to legalny sposób wywołania metody fabryki?

Odpowiedz

24

Ten fabularne nazywa się „Implicit Member Expression

Pośrednia wyrażenie człon jest skrótem sposobem dostępu członek typu, taki jak przypadek wyliczeniowy lub metoda klasy, w kontekście, w którym typ wnioskowania może określić domniemany typ. Ma on następującą postać:

.nazwę użytkownika


Ale od teraz, radzę nie powinny Funkcja ta Optional lub ImplicitlyUnwrappedOptional kontekście .

Chociaż to działa:

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

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

Ten kompilator wywala :(

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

Kompilator ma kilka błędów zob. does swift not allow initialization in function parameters?

+1

Należy zauważyć, że, przynajmniej w Swift 3.2, ten ostatni przykład _nie_ powoduje awarię kompilatora, a tak naprawdę (po wstawieniu pominiętych etykiet argumentów) działa dobrze. –

9

Wygląda Zasada jest taka: jeśli typ ma statyczną metodę, która zwraca tego typu, można pominąć nazwę typu, jeśli typ zwracany jest już ustalone: ​​

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

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

Zastanawiam się, czy jest to zamierzone, lub efektem ubocznym realizacji wyliczenia, które, biorąc pod uwagę tę funkcję, może być może pomyślał cukru jako składniowej na coś takiego:

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

nie mogłem znaleźć nic wzdłuż linii w dokumentacji. Uważam jednak, że Swift wie, który typ jest w kontekście od self.view.backgroundColor, dlatego wyrażenie rozpoczynające się bezpośrednio od kropki powinno być statyczne dla tego typu (albo metoda statyczna, albo właściwość statyczna).

Poniższe działa dobrze:

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

    static var fooProperty: Foo = Foo() 
} 

var foo: Foo 

foo = .fooMethod() 

foo = .fooProperty 
Powiązane problemy