Swift Language
estensioni
Ricerca…
Osservazioni
Puoi leggere ulteriori informazioni sulle estensioni in The Swift Programming Language .
Variabili e funzioni
Le estensioni possono contenere funzioni e variabili di calcolo calcolate / costanti. Sono nel formato
extension ExtensionOf {
//new functions and get-variables
}
Per fare riferimento all'istanza dell'oggetto esteso, è possibile utilizzare self
, proprio come potrebbe essere utilizzato
Per creare un'estensione di String
che aggiunge una funzione .length()
che restituisce la lunghezza della stringa, ad esempio
extension String {
func length() -> Int {
return self.characters.count
}
}
"Hello, World!".length() // 13
Le estensioni possono contenere anche variabili get
. Ad esempio, aggiungendo una variabile .length
alla stringa che restituisce la lunghezza della stringa
extension String {
var length: Int {
get {
return self.characters.count
}
}
}
"Hello, World!".length // 13
Inizializzatori in estensioni
Le estensioni possono contenere gli inizializzatori di convenienza. Ad esempio, un inizializzatore disponibile per Int
che accetta una NSString
:
extension Int {
init?(_ string: NSString) {
self.init(string as String) // delegate to the existing Int.init(String) initializer
}
}
let str1: NSString = "42"
Int(str1) // 42
let str2: NSString = "abc"
Int(str2) // nil
Quali sono le estensioni?
Le estensioni vengono utilizzate per estendere la funzionalità dei tipi esistenti in Swift. Le estensioni possono aggiungere pedici, funzioni, inizializzatori e proprietà calcolate. Possono anche rendere i tipi conformi ai protocolli .
Supponiamo che tu voglia essere in grado di calcolare il fattoriale di un Int
. È possibile aggiungere una proprietà calcolata in un'estensione:
extension Int {
var factorial: Int {
return (1..<self+1).reduce(1, combine: *)
}
}
Quindi puoi accedere alla proprietà come se fosse stata inclusa nell'API Int originale.
let val1: Int = 10
val1.factorial // returns 3628800
Estensioni di protocollo
Una caratteristica molto utile di Swift 2.2 è la possibilità di estendere i protocolli.
Funziona praticamente come le classi astratte quando si tratta di una funzionalità che si desidera essere disponibile in tutte le classi che implementa un protocollo (senza dover ereditare da una classe comune di base).
protocol FooProtocol {
func doSomething()
}
extension FooProtocol {
func doSomething() {
print("Hi")
}
}
class Foo: FooProtocol {
func myMethod() {
doSomething() // By just implementing the protocol this method is available
}
}
Questo è anche possibile usando i generici.
restrizioni
È possibile scrivere un metodo su un tipo generico che è più restrittivo usando la frase.
extension Array where Element: StringLiteralConvertible {
func toUpperCase() -> [String] {
var result = [String]()
for value in self {
result.append(String(value).uppercaseString)
}
return result
}
}
Esempio di utilizzo
let array = ["a","b","c"]
let resultado = array.toUpperCase()
Quali sono le estensioni e quando usarle
Le estensioni aggiungono nuove funzionalità a una classe esistente, struttura, enumerazione o tipo di protocollo. Ciò include la possibilità di estendere i tipi per i quali non si ha accesso al codice sorgente originale.
Le estensioni in Swift possono:
- Aggiungi proprietà calcolate e proprietà del tipo calcolato
- Definire metodi di istanza e metodi di tipo
- Fornire nuovi inizializzatori
- Definisci pedici
- Definire e utilizzare nuovi tipi nidificati
- Rendere un tipo esistente conforme a un protocollo
Quando usare Swift Extensions:
- Funzionalità aggiuntive per Swift
- Funzionalità aggiuntive per UIKit / Foundation
- Funzionalità aggiuntive senza incasinare il codice di altre persone
- Classi di suddivisione in: Dati / Funzionalità / Delegato
Quando non usare:
- Estendi le tue classi da un altro file
Semplice esempio:
extension Bool {
public mutating func toggle() -> Bool {
self = !self
return self
}
}
var myBool: Bool = true
print(myBool.toggle()) // false
pedici
Le estensioni possono aggiungere nuove iscrizioni a un tipo esistente.
Questo esempio ottiene il carattere all'interno di una stringa utilizzando l'indice specificato:
extension String {
subscript(index: Int) -> Character {
let newIndex = startIndex.advancedBy(index)
return self[newIndex]
}
}
var myString = "StackOverFlow"
print(myString[2]) // a
print(myString[3]) // c
extension String {
subscript(offset: Int) -> Character {
let newIndex = self.index(self.startIndex, offsetBy: offset)
return self[newIndex]
}
}
var myString = "StackOverFlow"
print(myString[2]) // a
print(myString[3]) // c