Extension rapide


L'extension consiste à ajouter une nouvelle fonctionnalité à une classe, une structure ou un type d'énumération existant.

Les extensions peuvent ajouter de nouvelles fonctionnalités à un type, mais ne peuvent pas remplacer les fonctionnalités existantes.

Les extensions dans Swift peuvent :

  • Ajouter des propriétés calculées et des propriétés statiques calculées

  • Définir des méthodes et des types d'instance Méthodes

  • fournir de nouveaux constructeurs

  • définir des indices

  • définir et utiliser de nouveaux types imbriqués

  • Rendre un type existant conforme à un protocole

Syntaxe

Déclaration d'extension à l'aide de mots-clésextension

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

Une extension peut étendre un type existant afin qu'il puisse s'adapter à un ou plusieurs protocoles. Le format de syntaxe est le suivant :

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

Attribut calculé

Les extensions peuvent ajouter des calculs. propriétés d'instance et propriétés de type calculées aux types existants.

Instance

L'exemple suivant ajoute 5 attributs d'instance calculés au type Int et étend ses fonctionnalités :

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)")

Le résultat de sortie de l'exécution du programme ci-dessus est :

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

Constructeurs

Les extensions peuvent ajouter de nouveaux constructeurs aux types existants.

Cela vous permet d'étendre d'autres types, de transmettre vos propres types personnalisés en tant que paramètres de constructeur ou de fournir des options d'initialisation supplémentaires non incluses dans l'implémentation originale du type.

Les extensions peuvent ajouter un nouvel initialiseur pratique init() à une classe, mais elles ne peuvent pas ajouter un nouveau constructeur ou destructeur désigné deinit() à une classe.

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)")

Le résultat de l'exécution du programme ci-dessus est :

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

Méthodes

Les extensions peuvent ajouter de nouvelles méthodes d'instance et des méthodes de type aux types existants.

L'exemple suivant ajoute une nouvelle méthode d'instance nommée sujets au type Int :

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

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

Le résultat de sortie de l'exécution du programme ci-dessus est :

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

This topics La méthode utilise Un seul paramètre de type () -> (), indiquant que la fonction n'a aucun paramètre ni aucune valeur de retour.

Après avoir défini cette extension, vous pouvez appeler la méthode topics sur n'importe quel entier pour effectuer une tâche plusieurs fois :


Méthode d'instance variable

Méthodes d'instance ajoutées par extension peut également modifier l'instance elle-même.

Les méthodes dans les structures et les types d'énumération qui modifient soi ou ses propriétés doivent marquer la méthode d'instance comme étant en mutation, tout comme la méthode de modification de l'implémentation d'origine.

Exemple

L'exemple suivant ajoute une nouvelle méthode de modification nommée square au type Double de Swift pour implémenter le calcul carré d'une valeur primitive :

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)")

Ci-dessus Le résultat de sortie du programme l'exécution est :

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

Indice

L'extension peut ajouter un nouvel indice à un type existant.

Exemple

L'exemple suivant ajoute un indice entier au type intégré Swift Int. L'indice [n] renvoie un nombre décimal

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])

Le résultat de l'exécution du programme ci-dessus est :

2
6
5

Le type imbriqué

peut être étendu aux classes existantes, Ajouter nouveaux types imbriqués dans les structures et les énumérations :

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])

Le résultat de l'exécution du programme ci-dessus est :

 10 
 20 
 30 
 40 
 50 
 50