Latest web development tutorials

Swift Expansion

Es ist eine vorhandene Klasse, Struktur oder Aufzählungstyp zu erweitern, um neue Funktionen hinzuzufügen.

Erweiterungen können neue Funktionen auf einen Typ hinzuzufügen, kann aber nicht vorhandene Funktionalität außer Kraft setzen.

Der Swift Expansion kann:

  • In Rechen Eigenschaften und Rechen statische Eigenschaften
  • Beispiele für Verfahren und Typen definiert Methoden
  • New Konstruktor
  • Standard-Definition
  • Definition und Verwendung der neuen verschachtelten Typen
  • Machen Sie eine vorhandene Leitung mit einem Protokolltyp

Grammatik

Verlängerung Erklärungen verwenden Sie das Schlüsselwort -Erweiterung:

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

Eine Erweiterung kann eine bestehende Art erstrecken, kann sie auf eine oder mehrere Protokolle angepasst werden, Syntax lautet wie folgt:

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

Computational Eigenschaften

Erweiterungen können ein berechnetes Beispiel für die Art der Immobilie und Rechen Eigenschaften bestehender Typen hinzuzufügen.

Beispiele

Das folgende Beispiel fügt fünf Objekte, die dem Rechenbeispiel des Typs Int und erweitern die 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 obige Programmausführung Ausgabe ist:

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

constructor

Erweiterungen können neue Konstrukteure bestehender Typen hinzuzufügen.

Auf diese Weise können Sie andere Arten, Ihre eigenen benutzerdefinierten Typ als Konstruktor Argument, oder die Art der zusätzlichen Initialisierungsoptionen sofern nicht in der ursprünglichen Umsetzung einbezogen zu verlängern.

Erweiterungen können neue Convenience-Konstruktor der Klasse init () hinzufügen, aber sie können nicht neu benannten Konstruktor oder Destruktor deinit der Klasse () hinzufügen.

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

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

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

let calc = mult()
print ("mult 模块内 \(calc.a.num1, calc.a.num2)")
print("mult 模块内 \(calc.b.no1, calc.b.no2)")

let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))

print("mult 模块内 \(memcalc.a.num1, memcalc.a.num2)")
print("mult 模块内 \(memcalc.b.no1, memcalc.b.no2)")

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


let a = sum(num1: 100, num2: 200)
print("Sum 模块内:\( a.num1, a.num2)")


let b = diff(no1: 200, no2: 100)
print("Diff 模块内: \(b.no1, b.no2)")

Die obige Programmausführung Ausgabe ist:

mult 模块内 (100, 200)
mult 模块内 (200, 100)
mult 模块内 (300, 500)
mult 模块内 (300, 100)
Sum 模块内:(100, 200)
Diff 模块内: (200, 100)

Weg

Erweiterungen können zu den bestehenden Typen neue Methoden und Instanztyp Methoden hinzufügen.

Im folgenden Beispiel wird eine neue Instanz Methode mit dem Namen Themen Int-Typ:

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

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

Die obige Programmausführung Ausgabe ist:

扩展模块内
扩展模块内
扩展模块内
扩展模块内
内型转换模块内
内型转换模块内
内型转换模块内

Die topics Methode verwendet ein () -> () Einzeltyp - Parameter, was darauf hinweist , dass die Funktion keine Parameter und keinen Rückgabewert hat.

Nach der Erweiterung definieren, können Sie für jede ganze Zahl nennen topics Methoden , um die Funktion zu erreichen , ist eine Aufgabe wiederholt ausführen:


Variable Instanzmethode

Beispiele für Verfahren, durch Zugabe von Erweiterungen können auch die Instanz selbst ändern.

Struktur und Aufzählungstypen selbst oder Eigenschaft ändern Methoden als Instanzmethode von mutierenden markiert werden müssen, nur die ursprüngliche Implementierung des Verfahrens aus dem gleichen ändern.

Beispiele

Im folgenden Beispiel wird eine neue Modifikationsverfahren zu Swift Double Typ namens Quadrat einen quadratischen ursprünglichen Wert-Berechnung zu erreichen:

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 obige Programmausführung Ausgabe ist:

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

Index

Erweiterungen können neue Index mit einem vorhandenen Typ hinzuzufügen.

Beispiele

Das folgende Beispiel zu Swift fügt einen eingebauten Typ Int Integer-Index. Der Index [n] Gibt die Dezimalzahl

extension Int {
   subscript(var multtable: Int) -> Int {
      var no1 = 1
      while multtable > 0 {
         no1 *= 10
         --multtable
      }
      return (self / no1) % 10
   }
}
    
print(12[0])
print(7869[1])
print(786543[2])

Die obige Programmausführung Ausgabe ist:

2
6
5

Verschachtelte Typen

Sie können die vorhandenen Klassen, Strukturen zu erweitern, und Aufzählungen fügen Sie eine neue verschachtelte Typen:

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 obige Programmausführung Ausgabe ist:

 10 
 20 
 30 
 40 
 50 
 50