스위프트 확장


확장이란 기존 클래스, 구조 또는 열거형 유형에 새로운 기능을 추가하는 것입니다.

확장 기능은 유형에 새로운 기능을 추가할 수 있지만 기존 기능을 재정의할 수는 없습니다.

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.070735

Subscript

확장 기능은 기존 유형에 새 첨자를 추가할 수 있습니다.

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
🎜