2014-07-01 23 views
7

Ja oglądając ten Swift poradnik i tam jest ta linia:Uibutton jako UIButton w szybkim?

var button:UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton 

dwa pytania:

  1. dlaczego jest to, że linia zakończona as UIButton? Czy linia nie jest wystarczająco przejrzysta, aby użytkownik chciał utworzyć przycisk typu systemu? Wydaje się, że jest zbędny.
  2. Czy konieczne jest zadeklarowanie typu UIButton w pierwszej części linii? Lub innymi słowy, nie wystarczy, aby uznać je jak

przycisku var = UIButton.buttonWithType (UIButtonType.System)

To znaczy, jeśli część po znaku równości jest inicjowanie przycisk typu systemu nie jest wystarczający, aby kompilator mógł wywnioskować, że button to UIButton? Mam na myśli, Apple powiedział, że kompilator jest inteligentny, aby wywnioskować typy.

+0

Wiele ** ** wasze pytania * Ciekawi * podstawowe pytania, które chciałem też zapytać (ale myślę, jesteś dwa lata przed mną w krzywa uczenia się.) Normalnie nie znajdziesz odpowiedzi na takie pytania, chyba że zapytasz na SO. – Honey

Odpowiedz

10

Konieczne jest obniżenie wartości as UIButton. buttonWithType() return AnyObject!, a nie UIButton, więc konieczne jest obniżenie. Poza tym nie musisz jawnie wpisywać zmiennej przy pomocy : UIButton. Ponieważ typ powrotu buttonWithType() jako downcast do UIButton, typ zmiennych zostanie określony jako UIButton. To, co należy użyć:

var button = UIButton.buttonWithType(UIButtonType.System) as UIButton 
+11

I wydaje się, że podstawową przyczyną jest metoda ObjectWithType: 'zadeklarowana jako zwracająca' id' zamiast 'instancetype'. –

+2

doskonały anser i doskonały komentarz od Martina! Teraz widzę AnyObject! = id! Dzięki!!! – SpaceDog

+0

Od Swift 1.2 musisz użyć 'as!', Aby wymusić downcast –

2

Jeśli cmd kliknięciu buttonWithType widać, że w szybki jej zadeklarowane jako

class func buttonWithType(buttonType: UIButtonType) -> AnyObject! 

Ponieważ typ zwraca się AnyObject! musisz wpisać go z powrotem do UIButton.

+3

, co jest opcjonalne i może być zerowe. – Sulthan

+0

Masz rację, myślałem przed nim, zmienię swój post, dzięki za złapanie go. –

7

Niektóre dodatkowe tło oprócz już udzielonych odpowiedzi: Sposób Objective-C

+ (id)buttonWithType:(UIButtonType)buttonType 

powraca id. Był to "tradycyjny" sposób deklarowania "metody fabrycznej" w taki sposób, aby można ją było używać również z podklas. Nie ma typu cast konieczne

UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem]; 

ponieważ id można przekształcić w dowolnym wskaźnikiem Objective-C.

Teraz równoważny typ do id w Swift jest AnyObject, a powyższa metoda jest odwzorowywany

class func buttonWithType(buttonType: UIButtonType) -> AnyObject! 

Swift jest znacznie bardziej rygorystyczne i robi nie niejawnie konwertować typy, dlatego zwracana wartość musi być oddanych do UIButton wyraźnie:

var button = UIButton.buttonWithType(UIButtonType.System) as UIButton 

"nowoczesnego" stosownych Oświadczam, że metody fabryczne to instancetype (patrz na przykład http://nshipster.com/instancetype/ lub Would it be beneficial to begin using instancetype instead of id?).Prostym przykładem jest sposób

+ (instancetype)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc 

NSString który jest odwzorowany w SWIFT

class func stringWithCString(cString: CString, encoding enc: UInt) -> Self! 

Self jest typ obiektu, na którym jest wywoływana, tak że typ wartości

to NSString! i typ zwrotu

NSMutableString.stringWithCString("bar", encoding: NSUTF8StringEncoding) 

to NSMutableString!. Nie jest wymagane odlewanie typu w Swift. W poniższym przykład Swift kompilator „wie”, że str jest NSString:

var str = NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding) 
var cs = str.UTF8String 

Nagłówki ramowe Foundation używałeś instancetype w wielu miejscach, ale nie wszędzie jeszcze gdzie jest to możliwe (jak w buttonWithType:). Może to ulec poprawie w przyszłych wersjach pakietów SDK.

+0

Jak to jest, że przyciski są * metodami klasy *? Czy też ** instancja ** UIButton jest równa jednej z metod fabrycznych/metod klasy UIButton? – Honey

+0

@ Miód: 'UIButton.buttonWithType (...)' jest metodą klasy (lub lepiej: była jako metoda klasy w Swift 1). –

+0

Dostaję tę część, ale nie tylko mylić, jak coś, co mutuje ie i jest instancją wywodzi się z metody klasy – Honey

0

Swift 2.1 jest teraz

var button = UIButton(type: .System) 

więc nie trzeba się przygnębiony z .buttonWithType