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

fonte

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:

2.2
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
3.0
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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow