Swift - Phần mở rộng

Chức năng của một lớp, cấu trúc hoặc kiểu liệt kê hiện có có thể được thêm vào với sự trợ giúp của các phần mở rộng. Chức năng loại có thể được thêm vào bằng các tiện ích mở rộng nhưng không thể ghi đè chức năng với các tiện ích mở rộng.

Swift Extension Functionalities -

  • Thêm thuộc tính được tính toán và thuộc tính kiểu được tính toán
  • Định nghĩa phương thức thể hiện và kiểu.
  • Cung cấp bộ khởi tạo mới.
  • Xác định chỉ số phụ
  • Định nghĩa và sử dụng các kiểu lồng nhau mới
  • Làm cho một loại hiện có tuân theo một giao thức

Các tiện ích mở rộng được khai báo với từ khóa 'tiện ích mở rộng'

Cú pháp

extension SomeType {
   // new functionality can be added here
}

Kiểu hiện tại cũng có thể được thêm vào với các phần mở rộng để làm cho nó trở thành một tiêu chuẩn giao thức và cú pháp của nó tương tự như các lớp hoặc cấu trúc.

extension SomeType: SomeProtocol, AnotherProtocol {
   // protocol requirements is described here
}

Thuộc tính tính toán

Các thuộc tính 'instance' và 'type' được tính toán cũng có thể được mở rộng với sự trợ giúp của các phần mở rộng.

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 is \(addition)")

let subtraction = 120.sub
print("Subtraction is \(subtraction)")

let multiplication = 39.mul
print("Multiplication is \(multiplication)")

let division = 55.div
print("Division is \(division)")

let mix = 30.add + 34.sub
print("Mixed Type is \(mix)")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Addition is 103
Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

Khởi tạo

Swift 4 cung cấp sự linh hoạt để thêm các trình khởi tạo mới vào một kiểu hiện có bằng các phần mở rộng. Người dùng có thể thêm các kiểu tùy chỉnh của riêng họ để mở rộng các kiểu đã được xác định và các tùy chọn khởi tạo bổ sung cũng có thể thực hiện được. Phần mở rộng chỉ hỗ trợ init (). deinit () không được hỗ trợ bởi các phần mở rộng.

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 ("Inside mult block \(calc.a.num1, calc.a.num2)")
print("Inside mult block \(calc.b.no1, calc.b.no2)")

let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))
print("Inside mult block \(memcalc.a.num1, memcalc.a.num2)")
print("Inside mult block \(memcalc.b.no1, memcalc.b.no2)")

extension mult {
   init(x: sum, y: diff) {
      let X = x.num1 + x.num2
      let Y = y.no1 + y.no2
   }
}

let a = sum(num1: 100, num2: 200)
print("Inside Sum Block:\( a.num1, a.num2)")

let b = diff(no1: 200, no2: 100)
print("Inside Diff Block: \(b.no1, b.no2)")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Inside mult block (100, 200)
Inside mult block (200, 100)
Inside mult block (300, 500)
Inside mult block (300, 100)
Inside Sum Block:(100, 200)
Inside Diff Block: (200, 100)

Phương pháp

Các phương thức phiên bản mới và các phương thức kiểu có thể được thêm vào lớp con với sự trợ giúp của các phần mở rộng.

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

4.topics(summation: {
   print("Inside Extensions Block")
})

3.topics(summation: {
   print("Inside Type Casting Block")
})

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Type Casting Block
Inside Type Casting Block
Inside Type Casting Block

Hàm topic () nhận đối số kiểu '(tổng kết: () → ())' để chỉ ra hàm không nhận bất kỳ đối số nào và nó sẽ không trả về bất kỳ giá trị nào. Để gọi hàm đó nhiều lần, khối for được khởi tạo và lệnh gọi phương thức có topic () được khởi tạo.

Phương pháp đột biến

Các phương thức phiên bản cũng có thể bị thay đổi khi được khai báo là phần mở rộng.

Các phương thức cấu trúc và liệt kê sửa đổi bản thân hoặc các thuộc tính của nó phải đánh dấu phương thức thể hiện là thay đổi, giống như phương thức thay đổi từ một triển khai ban đầu.

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
print("Area of circle is: \(Trial1)")

var Trial2 = 5.8
Trial2.square()
print("Area of circle is: \(Trial2)")

var Trial3 = 120.3
Trial3.square()
print("Area of circle is: \(Trial3)")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Area of circle is: 34.210935
Area of circle is: 105.68006
Area of circle is: 45464.070735

Đăng ký

Bạn cũng có thể thêm các chỉ số mới vào các phiên bản đã được khai báo bằng các tiện ích mở rộng.

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

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

2
6
5

Các loại lồng nhau

Các kiểu lồng nhau cho các thể hiện lớp, cấu trúc và kiểu liệt kê cũng có thể được mở rộng với sự trợ giúp của các phần mở rộng.

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(numb: [0, 1, 2, 3, 4, 7])

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

10
20
30
40
50
50