2014-06-13 12 views
7

Apple's documentation è abbastanza chiaro su come i metodi di inizializzazione Objective-C vengono convertiti in intializers Swift:Come vengono convertiti i metodi factory Objective-C negli inizializzatori di convenienza Swift?

Il prefisso “init” viene affettato off e diventa una parola chiave per indicare che il metodo è un inizializzatore. Per i metodi init che iniziano con "initWith", anche il "With" viene eliminato. La prima lettera del pezzo del selettore con "init" o "initWith" diviso diventa minuscola e quel pezzo del selettore viene considerato come il nome del primo argomento. Il resto dei pezzi del selettore corrispondono anche ai nomi degli argomenti.

È anche possibile utilizzare i metodi di classe di fabbrica come inizializzatori; tuttavia, ci sono molte meno informazioni su come questi nomi di selettori sono mappati alle funzioni Swift:

Per coerenza e semplicità, i metodi di fabbrica Objective-C vengono mappati come iniziatori di convenienza in Swift. Questa mappatura consente di utilizzarli con la stessa sintassi chiara e concisa degli inizializzatori. Per esempio, mentre in Objective-C si potrebbe chiamare questo metodo factory come questo:

Objective-C

UIColor *color = [UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0]; 

In Swift, si chiama così:

SWIFT

let color = UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0) 

Quali sono le regole per mappare i metodi factory Objective-C agli inizializzatori Swift?

risposta

6

Da quello che sono riuscito a capire semplicemente giocando, le seguenti regole vengono utilizzate per convertire i metodi di fabbrica in inizializzatori di convenienza.

  1. voce dell'Elenco
  2. metodo è un metodo della classe
  3. tipo di ritorno è instancetype o MyClassName *
  4. metodo richiede almeno un argomento
  5. Nome metodo inizia con una "classe nome suffisso"; cioè, un suffisso del nome della classe, con la restrizione che non è possibile avere parole parziali. Opzionalmente la prima lettera può essere in minuscolo.

Il nome della classe suffisso (eventualmente seguita da "Con" come nella conversione initWith) viene eliminata e il resto del nome del metodo viene utilizzato per il primo parametro, con la prima lettera in minuscolo.

Per esempio, si applicano le seguenti conversioni:

[MyClassName myClassNameWithObject:obj] → MyClassName(object: obj) 
[MyClassname classNameWithObject:obj] → MyClassName(object: obj) 
[MyClassName nameObject:obj]   → MyClassName(object: obj) 

Nota: dal momento che quelli tutto mappa per la stessa initializer rapido, solo una sarà disponibile (in genere il primo dichiarati)

+1

vedo che questo è un self ask post di autodidatta ... ma se vuoi approfondire questo, il video interop di approfondimento di WWDC è molto buono. – Jack

+1

@JackWu che il video è molto buono per ottenere una comprensione di base, ma non entra in profondità più della documentazione quando si tratta di metodi di fabbrica – Jayson

Problemi correlati