스위프트 확장
확장이란 기존 클래스, 구조 또는 열거형 유형에 새로운 기능을 추가하는 것입니다.
확장 기능은 유형에 새로운 기능을 추가할 수 있지만 기존 기능을 재정의할 수는 없습니다.
Swift의 확장 기능은 다음과 같습니다.
계산 및 계산된 정적 속성 추가
인스턴스 및 유형 메서드 정의
새 생성자 제공
아래 첨자 정의
-
새로운 중첩 유형 정의 및 사용
기존 유형을 특정 프로토콜에 맞게 만들기
구문
확장 선언은 키워드를 사용합니다. extension:
extension SomeType { // 加到SomeType的新功能写到这里 }
확장은 기존 유형을 확장할 수 있습니다. 하나 이상의 프로토콜에 적응할 수 있도록 하려면 구문 형식은 다음과 같습니다.
extension SomeType: SomeProtocol, AnotherProctocol { // 协议实现写到这里 }
계산된 속성
Extensions는 계산된 인스턴스 속성과 계산된 유형 속성을 기존 유형에 추가할 수 있습니다.
Instances
다음 예에서는 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
Constructor
Extensions는 기존 유형 생성자에 새 유형을 추가할 수 있습니다. .
이를 통해 다른 유형을 확장하거나, 사용자 정의 유형을 생성자 매개변수로 전달하거나, 유형의 원래 구현에 포함되지 않은 추가 초기화 옵션을 제공할 수 있습니다.
확장 기능은 새로운 편의 초기화 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)
Method
Extension은 기존 유형에 새로운 인스턴스 메소드와 유형 메소드를 추가할 수 있습니다.
다음 예에서는 Topics라는 새 인스턴스 메서드를 Int 유형에 추가합니다.
extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ print("扩展模块内") }) 3.topics({ print("内型转换模块内") })
위 프로그램 실행의 출력 결과는 다음과 같습니다.
扩展模块内 扩展模块内 扩展模块内 扩展模块内 内型转换模块内 内型转换模块内 内型转换模块内
이 topics
메서드는 ()를 사용합니다. - 함수에 매개변수와 반환 값이 없음을 나타내는 > ()
유형의 단일 매개변수입니다. topics
方法使用了一个() -> ()
类型的单参数,表明函数没有参数而且没有返回值。
定义该扩展之后,你就可以对任意整数调用 topics
topics
메서드를 호출할 수 있으며 이 함수는 특정 작업을 여러 번 수행하는 것입니다. 변수 인스턴스 메서드확장을 통해 추가된 인스턴스 메서드 인스턴스 자체도 수정할 수 있습니다. self 또는 해당 속성을 수정하는 구조 및 열거형의 메서드는 원래 구현의 수정 메서드와 마찬가지로 인스턴스 메서드를 변경으로 표시해야 합니다. 예제다음 예에서는 원시 값의 제곱 계산을 구현하기 위해 Swift의 Double 유형에 square라는 새로운 수정 방법을 추가합니다.
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.070735Subscript
확장 기능은 기존 유형에 새 첨자를 추가할 수 있습니다. Example다음 예제에서는 Swift 내장 유형 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🎜