Latest web development tutorials

스위프트 확장

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

확장 유형에 새로운 기능을 추가 할 수 있지만 기존 기능을 무시할 수 없습니다.

스위프트 확장 할 수 있습니다

  • 계산 속성과 연산 정적 속성 추가
  • 방법의 실시 예 및 타입 정의 방법
  • 새로운 생성자
  • 표준의 정의
  • 정의 및 새로운 중첩 유형의 사용
  • 프로토콜 종류와 기존 라인을

문법

확장 선언은 키워드확장을 사용 :

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

다음과 같이 기존의 형식을 확장 할 수있는 확장이, 그것은 하나 이상의 프로토콜에 적용 할 수 있고, 구문은 다음과

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

전산 등록

확장 성 및 기존 유형의 계산 속성의 유형의 계산 예를 추가 할 수 있습니다.

다음 예제는 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

생성자

확장 기존 유형에 새 생성자를 추가 할 수 있습니다.

이것은 당신이 다른 유형, 생성자 인자, 또는 제공하는 원래의 구현에 포함되지 않은 추가 초기화 옵션의 유형으로 사용자 정의 형식을 확장 할 수 있습니다.

확장 클래스의 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 기능을 달성하는 방법은 반복 작업을 수행 할 수 있습니다 :


변수 인스턴스 메소드

추가 확장에 의한 방법의 예는 인스턴스 자체를 수정할 수 있습니다.

구조 및 열거 형식은 동일의 방법의 원래 구현을 수정, 자기 또는 재산 방법이 돌연변이의 인스턴스 방법으로 표시해야합니다 수정합니다.

다음의 예는 정사각형 원래 값 계산을 달성하기 위해 스위프트의 두 종류로 광장이라는 새로운 수정 방법을 추가합니다 :

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

첨자

확장 기존 유형에 새 인덱스를 추가 할 수 있습니다.

스위프트에 다음의 예는 내장 타입 지능 정수 인덱스를 추가합니다. 인덱스는 [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