スウィフト拡大
これは、新しい機能を追加するために既存のクラス、構造体、または列挙型を拡張することです。
拡張機能は、型に新しい機能を追加することができますが、既存の機能を上書きすることはできません。
スウィフト拡張することができます:
- 計算の性質と計算静的プロパティを追加します。
- メソッド定義されたメソッドとタイプの例
- 新しいコンストラクタ
- 標準的な定義
- 新しいネストされたタイプの定義と使用
- プロトコルタイプを持つ既存のラインを作ります
文法
拡張宣言は、キーワード拡張を使用します 。
extension SomeType { // 加到SomeType的新功能写到这里 }
次のように拡張子が、それが1つまたは複数のプロトコルに適合させることができる、既存の型を拡張することができ、構文は次のとおりです。
extension SomeType: SomeProtocol, AnotherProctocol { // 协议实现写到这里 }
計算プロパティ
拡張機能は、既存の型にプロパティと計算特性のタイプの計算例を追加することができます。
例
次の例では、int型の計算例に5つのプロパティを追加し、その機能を拡張します。
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
コンストラクタ
拡張機能は、既存の型に新しいコンストラクタを追加することができます。
これは、あなたが他のタイプは、コンストラクタの引数、または提供元の実装に含まれていない追加の初期化オプションの種類として、独自のカスタム・タイプを拡張することができます。
拡張機能は、クラスの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)
ウェイ
拡張機能は、既存の型に新しいメソッドとインスタンス型のメソッドを追加することができます。
次の例では、int型に新しいインスタンスメソッドという名前のトピックを追加します。
extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ print("扩展模块内") }) 3.topics({ print("内型转换模块内") })
上記プログラム実行出力は、次のとおりです。
扩展模块内 扩展模块内 扩展模块内 扩展模块内 内型转换模块内 内型转换模块内 内型转换模块内
topics
方法は使用しています() -> ()
関数にはパラメータや戻り値を持たないことを示す、単一の型パラメータを。
拡張子を定義したら、任意の整数のために呼び出すことができますtopics
機能を達成するための方法を繰り返しタスクを実行することです。
変数インスタンスメソッド
拡張機能を追加することにより方法の例はまた、インスタンス自体を変更することができます。
構造と列挙型は、ちょうど同じからメソッドの元の実装を変更し、自己または財産の方法は変異のインスタンスメソッドとしてマークする必要があります変更します。
例
次の例では、正方形の元の値の計算を達成するために、スウィフトの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
添字
拡張機能は、既存の型に新しいインデックスを追加することができます。
例
スウィフトへの次の例では、ビルトイン型のInt整数インデックスを追加します。 インデックス[n]は小数点数を返します。
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