Swift-Erweiterungen

Erweiterungen fügen einer vorhandenen Klasse, Struktur oder einem Enumerationstyp neue Funktionalität hinzu.

Erweiterungen können einem Typ neue Funktionalität hinzufügen, aber vorhandene Funktionalität nicht überschreiben.

Erweiterungen in Swift können:

  • Berechnete Eigenschaften und berechnete statische Eigenschaften hinzufügen
  • Instanzmethoden und Typmethoden definieren
  • Neue Initialisierer bereitstellen
  • Subscripts definieren
  • Neue verschachtelte Typen definieren und verwenden
  • Einen vorhandenen Typ an ein Protokoll anpassen

Syntax

Erweiterungsdeklarationen verwenden das Schlüsselwortextension:

extension SomeType {
    // 加到SomeType的新功能写到这里
}

Eine Erweiterung kann einen vorhandenen Typ erweitern, damit er einem oder mehreren Protokollen entspricht, mit dem folgenden Syntaxformat:

extension SomeType: SomeProtocol, AnotherProctocol {
    // 协议实现写到这里
}

Berechnete Eigenschaften

Erweiterungen können vorhandenen Typen berechnete Instanzeigenschaften und berechnete Typ-Eigenschaften hinzufügen.

Beispiel

Das folgende Beispiel fügt dem Int-Typ 5 berechnete Instanzeigenschaften hinzu und erweitert seine Funktionalität:

extension Int {
   var add: Int {return self + 100 }
   var sub: Int { return self - 10 }
   var mul: Int { return self * 10 }
   var div: Int { return self / 5 }
}
    
let addition = 3.add
print("加法运算后的值:\(addition)")
    
let subtraction = 120.sub
print("减法运算后的值:\(subtraction)")
    
let multiplication = 39.mul
print("乘法运算后的值:\(multiplication)")
    
let division = 55.div
print("除法运算后的值: \(division)")

let mix = 30.add + 34.sub
print("混合运算结果:\(mix)")

Die Ausgabe der obigen Programmausführung ist:

加法运算后的值:103
减法运算后的值:110
乘法运算后的值:390
除法运算后的值: 11
混合运算结果:154

Initialisierer

Erweiterungen können vorhandenen Typen neue Initialisierer hinzufügen.

Dadurch können Sie andere Typen erweitern, Ihre eigenen benutzerdefinierten Typen als Initialisiererparameter verwenden oder zusätzliche Initialisierungsoptionen bereitstellen, die in der ursprünglichen Implementierung des Typs nicht enthalten sind.

Erweiterungen können Klassen neue Convenience-Initialisierer init() hinzufügen, aber sie können Klassen keine neuen designierten Initialisierer oder Deinitialisierer deinit() hinzufügen.

struct sum {
    var num1 = 100, num2 = 200
}

struct diff {
    var no1 = 200, no2 = 100
}

struct mult {
    var a = sum()
    var b = diff()
}


extension mult {
    init(x: sum, y: diff) {
        _ = x.num1 + x.num2
        _ = y.no1 + y.no2
    }
}


let a = sum(num1: 100, num2: 200)
let b = diff(no1: 200, no2: 100)

let getMult = mult(x: a, y: b)
print("getMult sum\(getMult.a.num1, getMult.a.num2)")
print("getMult diff\(getMult.b.no1, getMult.b.no2)")

Die Ausgabe der obigen Programmausführung ist:

getMult sum(100, 200)
getMult diff(200, 100)

Methoden

Erweiterungen können vorhandenen Typen neue Instanzmethoden und Typmethoden hinzufügen.

Das folgende Beispiel fügt dem Int-Typ eine neue Instanzmethode namens topics hinzu:

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation() 
      }
   }
}  

4.topics({
   print("扩展模块内")       
})    
    
3.topics({
   print("内型转换模块内")       
})  

Die Ausgabe der obigen Programmausführung ist:

Within the extension module

DiestopicsMethode verwendet einen() -> ()einzelnen Parameter vom Typ, der angibt, dass die Funktion keine Parameter und keinen Rückgabewert hat.

Nach dem Definieren dieser Erweiterung können Sie für jede Ganzzahltopicsdie Methode aufrufen, die die Funktionalität implementiert, eine Aufgabe mehrmals auszuführen:


Mutierende Instanzmethoden

Durch Erweiterungen hinzugefügte Instanzmethoden können auch die Instanz selbst ändern.

In Strukturen und Aufzählungstypen müssen Methoden, die self oder dessen Eigenschaften ändern, die Instanzmethode als mutating kennzeichnen, genau wie es die Änderungsmethoden aus der ursprünglichen Implementierung tun.

Beispiel

Das folgende Beispiel fügt dem Double-Typ von Swift eine neue mutierende Methode namens square hinzu, um die Quadratberechnung des ursprünglichen Werts zu implementieren:

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
print("圆的面积为: \(Trial1)")


var Trial2 = 5.8
Trial2.square()
print("圆的面积为: \(Trial2)")


var Trial3 = 120.3
Trial3.square()
print("圆的面积为: \(Trial3)")

Die Ausgabe der obigen Programmausführung ist:

圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735

Subscripts

Erweiterungen können einem vorhandenen Typ neue Subscripts hinzufügen.

Beispiel

Das folgende Beispiel fügt dem integrierten Typ Int von Swift einen ganzzahligen Subscript hinzu. Der Subscript [n] gibt die Dezimalziffer zurück

extension Int {
    subscript(multtable: Int) -> Int {
        var powerOf10 = 1
        var index = multtable
        while index > 0 {
            powerOf10 *= 10
            index -= 1
        }
        return (self / powerOf10) % 10
    }
}

print(12[0])     // 输出:2
print(7869[1])   // 输出:6
print(786543[2]) // 输出:5

Die Ausgabe der obigen Programmausführung ist:

2
6
5

Verschachtelte Typen

Erweiterungen können neue verschachtelte Typen zu vorhandenen Klassen, Strukturen und Aufzählungen hinzufügen:

extension Int {
   enum calc
   {
      case add
      case sub
      case mult
      case div
      case anything
   }

   var print: calc {
      switch self
      {
         case 0:
            return .add
         case 1:
            return .sub
         case 2:
            return .mult
         case 3:
            return .div
         default:
            return .anything
       }
   }
}

func result(numb: [Int]) {
   for i in numb {
      switch i.print {
         case .add:
            print(" 10 ")
          case .sub:
            print(" 20 ")
         case .mult:
         print(" 30 ")
         case .div:
         print(" 40 ")
         default:
         print(" 50 ")

      }
   }
}

result([0, 1, 2, 3, 4, 7])

Die Ausgabe der obigen Programmausführung ist:

 10 
 20 
 30 
 40 
 50 
 50 
Andere Erweiterungen