Alcuni retroscena supplementari in aggiunta alle risposte già date: Il metodo di Objective-C
+ (id)buttonWithType:(UIButtonType)buttonType
rendimenti id
. Questo era il modo "tradizionale" per dichiarare un "metodo di fabbrica" in modo che fosse possibile utilizzare anche da sottoclassi. Non v'è alcun tipo di fusione necessaria
UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem];
perché id
possono essere convertiti in qualsiasi puntatore Objective-C.
Ora il tipo equivalente a id
a Swift è AnyObject
, e il metodo di cui sopra è mappato
class func buttonWithType(buttonType: UIButtonType) -> AnyObject!
Swift è molto più severa e fa non convertire implicitamente tipi, quindi il valore di ritorno deve essere cast UIButton
esplicitamente:
var button = UIButton.buttonWithType(UIButtonType.System) as UIButton
La "moderna" appro per dichiarare i metodi di fabbrica è instancetype
(vedere ad esempio http://nshipster.com/instancetype/ o Would it be beneficial to begin using instancetype instead of id?).Un semplice esempio è il NSString
metodo
+ (instancetype)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc
mappato in Swift a
class func stringWithCString(cString: CString, encoding enc: UInt) -> Self!
Self
è il tipo di oggetto su cui viene chiamato il metodo, in modo che il tipo di ritorno di
NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding)
è NSString!
e il tipo di ritorno
NSMutableString.stringWithCString("bar", encoding: NSUTF8StringEncoding)
è NSMutableString!
. Non è necessario il cast di tipo in Swift. Nel seguente esempio, il compilatore Swift "sa" che è un str
NSString
:
var str = NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding)
var cs = str.UTF8String
Le intestazioni quadro della Fondazione utilizzano già instancetype
in molti luoghi, ma non ancora in tutto il mondo, ove possibile (come in buttonWithType:
). Questo potrebbe essere migliorato nelle versioni future degli SDK .
Molte delle vostre domande ** ** * sono curiose domande fondamentali * che volevo anche chiedere (ma immagino sei 2 anni avanti a me nella curva di apprendimento). Normalmente non troverai risposte a tali domande se non ti viene chiesto su SO. – Honey