UIButton als UIButton in swift?

7

Ich beobachte dieses Swift Tutorial und da ist diese Zeile:

%Vor%

zwei Fragen:

  1. Warum endet diese Zeile mit as UIButton ? Ist die Zeile nicht klar genug, dass der Benutzer eine Schaltfläche vom Systemtyp erstellen möchte? Es scheint überflüssig zu sein.
  2. muss der Typ UIButton im ersten Teil der Zeile deklariert werden? Oder mit anderen Worten, ist nicht genug, um es wie
  3. zu erklären
  

var button = UIButton.buttonWithType (UIButtonType.System)

Ich meine, wenn der Teil nach dem Gleichheitszeichen eine Schaltfläche des Systemtyps initialisiert ist nicht genug, damit der Compiler ableitet button ist ein UIButton ? Ich meine, Apple sagte, der Compiler sei schlau, auf Typen zu schließen.

    
SpaceDog 01.07.2014, 19:18
quelle

4 Antworten

10

Sie müssen as UIButton gesenkt halten. buttonWithType() return AnyObject! , nicht UIButton , also ist der Downcast notwendig. Darüber hinaus müssen Sie die Variable nicht explizit mit : UIButton eingeben. Da der Rückgabetyp von buttonWithType() in UIButton zurückgestuft wird, wird der Typ der Variablen als UIButton abgeleitet. Dies sollten Sie verwenden:

%Vor%     
Mick MacCallum 01.07.2014, 19:43
quelle
7

Ein zusätzlicher Hintergrund zusätzlich zu den bereits gegebenen Antworten: Die Objective-C-Methode

%Vor%

gibt id zurück. Dies war der "traditionelle" Weg, eine "Fabrikmethode" so zu deklarieren, dass sie es ist kann auch von Unterklassen verwendet werden. In

ist kein Typcast erforderlich %Vor%

, weil id in einen Objective-C-Zeiger konvertiert werden kann.

Jetzt ist der äquivalente Typ zu id in Swift AnyObject und die obige Methode ist auf

abgebildet %Vor%

Swift ist viel strenger und konvertiert nicht implizit Typen, daher muss der Rückgabewert explizit in UIButton umgewandelt werden:

%Vor%

Der "moderne" Ansatz zum Deklarieren von Factory-Methoden ist instancetype (siehe zum Beispiel Ссылка oder Wäre es von Vorteil, instancetyp statt id zu verwenden? ) . Ein einfaches Beispiel ist die Methode NSString

%Vor%

, das in Swift zu

zugeordnet ist %Vor%

Self ist der Typ des Objekts, auf dem die Methode aufgerufen wird der Rückgabetyp von

%Vor%

ist NSString! und der Rückgabetyp von

%Vor%

ist NSMutableString! . In Swift ist kein Typcast erforderlich. Im Folgenden Beispiel: Der Swift-Compiler "weiß", dass str ein NSString :

ist %Vor%

Die Foundation-Framework-Header verwenden bereits instancetype an vielen Stellen, aber nicht aber überall wo möglich (wie in buttonWithType: ). Dies kann verbessert werden in zukünftige Versionen der SDKs.

    
Martin R 01.07.2014 21:01
quelle
2

Wenn Sie auf den buttonWithType klicken, sehen Sie, dass in swift es als

deklariert ist %Vor%

Da der zurückgegebene Typ AnyObject! Sie müssen es in UIButton zurückgeben.

    
Moti F. 01.07.2014 19:45
quelle
0

Swift 2.1 ist jetzt

%Vor%

Sie müssen also nicht mit .buttonWithType

ablehnen     
Shane 02.03.2016 09:24
quelle

Tags und Links