迅速な拡張機能


拡張とは、既存のクラス、構造体、または列挙型に新しい機能を追加することです。

拡張機能は型に新しい機能を追加できますが、既存の機能をオーバーライドすることはできません。

Swift の拡張機能では次のことが可能です:

  • 計算された静的プロパティと計算された静的プロパティを追加する

  • インスタンスと型メソッドを定義する

  • 新しいコンストラクターを提供する

  • 添字を定義する

  • 新しいネストされた型を定義して使用する

  • 既存の型を特定のプロトコルに準拠させる

構文

拡張宣言はキーワードを使用します extension:

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

拡張は既存の型を拡張できます。1 つ以上のプロトコルに適応できるようにするには、構文形式は次のとおりです。

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

計算プロパティ

拡張機能を使用すると、計算インスタンス プロパティと計算タイプ プロパティを既存の型に追加できます。

インスタンス

次の例では、5 つの計算インスタンス属性を Int 型に追加し、その機能を拡張します:

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

上記のプログラム実行の出力は次のとおりです:

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

Constructor

拡張機能により、既存の型コンストラクターに新しい型を追加できます。

これにより、他の型を拡張したり、独自のカスタム型をコンストラクター パラメーターとして渡したり、型の元の実装に含まれていない追加の初期化オプションを提供したりすることができます。

拡張機能は、新しい便利な初期化子 init() をクラスに追加できますが、新しい指定されたコンストラクターまたは deinit() をクラスに追加することはできません。

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

上記のプログラム実行の出力結果は次のとおりです:

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

メソッド

拡張機能は、既存の型に新しいインスタンス メソッドと型メソッドを追加できます。

次の例では、topics という名前の新しいインスタンス メソッドを Int 型に追加します:

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

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

上記のプログラム実行の出力結果は次のとおりです:

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

この topics メソッドは () を使用します。 - > () タイプの単一パラメータ。関数にパラメータも戻り値もないことを示します。 topics方法使用了一个() -> ()类型的单参数,表明函数没有参数而且没有返回值。

定义该扩展之后,你就可以对任意整数调用 topics

この拡張機能を定義した後、任意の整数に対して topics メソッドを呼び出すことができ、その関数は特定のタスクを複数回実行することになります:

変数インスタンス メソッド

拡張機能によって追加されたインスタンス メソッドインスタンス自体を変更することもできます。

自分自身またはそのプロパティを変更する構造体および列挙型内のメソッドは、元の実装からの変更メソッドと同様に、インスタンス メソッドを変更可能としてマークする必要があります。

次の例では、square という名前の新しい変更メソッドを Swift の Double 型に追加して、プリミティブ値の二乗計算を実装します:

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

上記のプログラムの実行の出力結果は次のとおりです:
圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735

Subscript

拡張機能は、既存の型に新しい添字を追加できます。

次の例では、Swift の組み込み型 Int に整数の添字を追加します。添字 [n] は 10 進数を返します

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

上記のプログラム実行出力は次のとおりです:
2
6
5

ネストされた型

拡張機能により、既存のクラス、構造体、列挙型に新しいネストされた型を追加できます:

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

実行の出力結果上記のプログラムの内容は次のとおりです:
 10 
 20 
 30 
 40 
 50 
 50
🎜