2014-08-30 14 views
14

Qual è attualmente il modo migliore/preferito per definire le conversioni esplicite in Swift? Della parte superiore della mia testa mi viene in mente due:Definizione della conversione esplicita per i tipi personalizzati in Swift

  • Creazione inizializzatori personalizzati per il tipo di destinazione tramite un'estensione, in questo modo:

    extension String { 
        init(_ myType: MyType) { 
        self = "Some Value" 
        } 
    } 
    

    In questo modo, si potrebbe utilizzare String(m) dove m è di tipo MyType per convertire m in una stringa.

  • definendo toType -Metodi nel tipo di origine, in questo modo:

    class MyType { 
        func toString() -> String { 
        return "Some Value" 
        } 
    } 
    

    Questo è paragonabile a Swift di String.toInt(), che restituisce un Int?. Ma se questo fosse il modo definitivo per andare, mi aspetterei che ci fossero protocolli per i tipi di base per questo, come un'inversione dei protocolli *LiteralConvertible già esistenti.

Sotto-domanda: Nessuno dei due metodi consentono qualcosa di simile per compilare: let s: MyString = myTypeInstance (as String) (parte tra parentesi opzionali), ma se ho capito bene, l'operatore as è solo per downcasting all'interno di tipo gerarchie, è che corretta?

risposta

9

Il modello utilizzato in swift è l'inizializzatore. Così, per esempio quando si converte un Int-UInt, dobbiamo scrivere:

var i: Int = 10 
var u: UInt = UInt(i) 

vorrei bastone con quel modello.

Per quanto riguarda il subquestion, la documentazione afferma che:

Type casting is a way to check the type of an instance, and/or to treat that instance as if it is a different superclass or subclass from somewhere else in its own class hierarchy.

e

You can also use type casting to check whether a type conforms to a protocol

quindi no, la parola chiave as può `t essere utilizzato per trasformare un valore di un certo tipo a un altro genere.

che può essere testato in modo semplice:

var i: Int = 10 
var u: UInt = i as UInt 

che genera un errore:

'Int' is not convertible to 'UInt' 

più su Type Casting

+0

OK, grazie. Anche gentile da parte tua includere la documentazione. Suppongo che fornire estensioni per i tipi di conversione integrati sia anche la cosa giusta da fare? – Kolja

+1

Sì, le estensioni sono lo strumento nelle nostre mani quando stiamo aggiungendo a tipi di terze parti. Per il nostro codice, è solo una questione di preferenza, naturalmente. In alcuni casi l'utilizzo di estensioni può aiutare a mantenere il nostro codice più organizzato e più facile da consultare. – Antonio

+1

Grazie ancora. Ora ho solo bisogno di una conversione implicita per i pochi casi in cui ha senso, ma che non otterrò da Swift. ;-) – Kolja

Problemi correlati