Ich beobachte dieses Swift Tutorial und da ist diese Zeile:
%Vor%zwei Fragen:
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. 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.
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:
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
, 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
Swift ist viel strenger und konvertiert nicht implizit Typen, daher muss der Rückgabewert explizit in UIButton
umgewandelt werden:
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
, das in Swift zu
zugeordnet ist %Vor% Self
ist der Typ des Objekts, auf dem die Methode aufgerufen wird
der Rückgabetyp von
ist NSString!
und der Rückgabetyp von
ist NSMutableString!
. In Swift ist kein Typcast erforderlich. Im Folgenden
Beispiel: Der Swift-Compiler "weiß", dass str
ein NSString
:
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.
Tags und Links swift