Einige zusätzliche Hintergrundinformationen zusätzlich zu den bereits gegebenen Antworten: Die Objective-C-Methode
+ (id)buttonWithType:(UIButtonType)buttonType
kehrt id
. Dies war der "traditionelle" Weg, eine "Factory-Methode" so zu deklarieren, dass sie auch von Unterklassen verwendet werden kann. Es gibt keine Art notwendig gegossen in
UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem];
weil id
kann auf jeden Objective-C-Zeiger umgewandelt werden.
Nun entspricht Typ id
in Swift ist AnyObject
, und das obige Verfahren wird gemappt
class func buttonWithType(buttonType: UIButtonType) -> AnyObject!
Swift ist viel strenger und tut nicht implizit Typen umwandeln, damit der Rückgabewert muss sein gieße UIButton
ausdrücklich:
var button = UIButton.buttonWithType(UIButtonType.System) as UIButton
die "moderne" appro ach, um Factory-Methoden zu deklarieren, ist instancetype
(siehe zum Beispiel http://nshipster.com/instancetype/ oder Would it be beneficial to begin using instancetype instead of id?).Ein einfaches Beispiel ist die NSString
Methode
+ (instancetype)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
die in Swift
class func stringWithCString(cString: CString, encoding enc: UInt) -> Self!
Self
ist die Art des Objekts, auf dem das Verfahren aufgerufen wird abgebildet wird, so dass der Rückgabetyp der
NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding)
ist NSString!
und der Rückgabetyp von
NSMutableString.stringWithCString("bar", encoding: NSUTF8StringEncoding)
ist NSMutableString!
. Kein Typ ist notwendig in Swift. Im folgenden Beispiel "weiß" der Swift-Compiler, dass str
ist ein NSString
:
var str = NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding)
var cs = str.UTF8String
Die Rahmen Foundation headers already instancetype
in vielen Orten verwenden, aber nicht noch überall, wo möglich (wie in buttonWithType:
). Dies kann in zukünftigen Versionen der SDKs in verbessert werden.
Viele ** Ihre ** Fragen sind * neugierig * grundlegende Fragen, die ich wollte auch (fragen, aber ich denke, Du bist 2 Jahre in der Lernkurve vor mir. Normalerweise wirst du keine Antworten auf solche Fragen finden, wenn du nicht nach SO gefragt wirst. – Honey