Szukaj…


Uwagi

Możesz przeczytać więcej o rozszerzeniach w Swift Programming Language .

Zmienne i funkcje

Rozszerzenia mogą zawierać funkcje i obliczane / stałe zmienne get. Są w formacie

extension ExtensionOf {
    //new functions and get-variables
}

Aby odwołać się do wystąpienia rozszerzonego obiektu, można użyć self , tak jak można go użyć

Aby utworzyć rozszerzenie String , która dodaje .length() funkcja, która zwraca długość łańcucha, na przykład

extension String {
    func length() -> Int {
        return self.characters.count
    }
}

"Hello, World!".length() // 13

Rozszerzenia mogą również zawierać zmienne get . Na przykład dodanie zmiennej .length do łańcucha, która zwraca długość łańcucha

extension String {
    var length: Int {
        get {
            return self.characters.count
        }
    }
}

"Hello, World!".length // 13

Inicjatory w rozszerzeniach

Rozszerzenia mogą zawierać wygodne inicjatory. Na przykład awaryjny inicjalizator dla Int który akceptuje 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

Co to są rozszerzenia?

Rozszerzenia służą do rozszerzania funkcjonalności istniejących typów w Swift. Rozszerzenia mogą dodawać indeksy dolne, funkcje, inicjatory i właściwości obliczane. Mogą także dostosowywać typy do protokołów .

Załóżmy, że chcemy, aby móc obliczyć silnię danego Int . Możesz dodać obliczoną właściwość w rozszerzeniu:

extension Int {
    var factorial: Int {
        return (1..<self+1).reduce(1, combine: *)
    }
}

Następnie możesz uzyskać dostęp do właściwości tak, jakby była zawarta w oryginalnym Int API.

let val1: Int = 10

val1.factorial  // returns 3628800

Rozszerzenia protokołu

Bardzo przydatną funkcją Swift 2.2 jest możliwość rozszerzania protokołów.

Działa podobnie jak klasy abstrakcyjne, jeśli chodzi o funkcjonalność, która ma być dostępna we wszystkich klasach, które implementują jakiś protokół (bez konieczności dziedziczenia z podstawowej wspólnej klasy).

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
    }
}

Jest to również możliwe przy użyciu ogólnych.

Ograniczenia

Możliwe jest napisanie metody typu ogólnego, która jest bardziej restrykcyjna przy użyciu zdania where.

extension Array where Element: StringLiteralConvertible {
  func toUpperCase() -> [String] {
      var result = [String]()
      for value in self {
          result.append(String(value).uppercaseString)
      }
      return result
    }        
}

Przykład zastosowania

let array = ["a","b","c"]
let resultado = array.toUpperCase()

Co to są rozszerzenia i kiedy ich używać

Rozszerzenia dodają nową funkcjonalność do istniejącej klasy, struktury, wyliczenia lub typu protokołu. Obejmuje to możliwość rozszerzenia typów, dla których nie masz dostępu do oryginalnego kodu źródłowego.

Rozszerzenia w Swift mogą:

  • Dodaj obliczone właściwości i obliczone właściwości typu
  • Zdefiniuj metody instancji i metody typów
  • Zapewnij nowe inicjatory
  • Zdefiniuj indeksy dolne
  • Zdefiniuj i używaj nowych typów zagnieżdżonych
  • Dostosuj istniejący typ do protokołu

Kiedy używać rozszerzeń Swift:

  • Dodatkowa funkcjonalność do Swift
  • Dodatkowa funkcjonalność do UIKit / Foundation
  • Dodatkowa funkcjonalność bez bałaganu z kodem innych osób
  • Podział klas na: Dane / Funkcjonalność / Delegat

Kiedy nie należy używać:

  • Rozszerz swoje własne klasy z innego pliku

Prosty przykład:

extension Bool {
    public mutating func toggle() -> Bool {
        self = !self
        return self
    }
}

var myBool: Bool = true
print(myBool.toggle()) // false

Źródło

Indeksy dolne

Rozszerzenia mogą dodawać nowe indeksy dolne do istniejącego typu.

W tym przykładzie znak jest wstawiany do ciągu za pomocą podanego indeksu:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow