Sambungan Swift


Sambungan adalah untuk menambah fungsi baharu pada kelas, struktur atau jenis penghitungan sedia ada.

Sambungan boleh menambah kefungsian baharu pada sesuatu jenis, tetapi tidak boleh mengatasi kefungsian sedia ada.

Pelanjutan dalam Swift boleh:

  • Tambah sifat dikira dan sifat statik yang dikira

  • Tentukan kaedah dan jenis contoh Kaedah

  • sediakan pembina baharu

  • tentukan subskrip

  • tentukan dan gunakan jenis Nested baharu

  • Jadikan jenis sedia ada mematuhi protokol

Sintaks

Pengisytiharan sambungan menggunakan kata kuncisambungan

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

Pelanjutan boleh memanjangkan jenis sedia ada supaya ia boleh menyesuaikan diri dengan satu atau lebih protokol Format sintaks adalah seperti berikut:

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

Atribut yang dikira

Sambungan boleh menambah yang dikira. sifat contoh dan sifat jenis dikira kepada jenis sedia ada.

Instance

Contoh berikut menambah 5 atribut tika yang dikira pada jenis Int dan memanjangkan fungsinya:

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

Hasil output pelaksanaan program di atas ialah:

加法运算后的值:103
减法运算后的值:110
乘法运算后的值:390
除法运算后的值: 11
混合运算结果:154

Pembina

Pelanjutan boleh menambah pembina baharu pada jenis sedia ada.

Ini membolehkan anda memanjangkan jenis lain, menghantar jenis tersuai anda sendiri sebagai parameter pembina atau menyediakan pilihan permulaan tambahan yang tidak termasuk dalam pelaksanaan asal jenis tersebut.

Sambungan boleh menambah pemula kemudahan baharu init() pada kelas, tetapi ia tidak boleh menambah pembina ditetapkan baharu atau pemusnah deinit() pada kelas.

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

Output pelaksanaan program di atas ialah:

mult 模块内 (100, 200)
mult 模块内 (200, 100)
mult 模块内 (300, 500)
mult 模块内 (300, 100)
Sum 模块内:(100, 200)
Diff 模块内: (200, 100)

Kaedah

Pelanjutan boleh menambah kaedah contoh baharu dan kaedah taip kepada jenis sedia ada.

Contoh berikut menambah kaedah contoh baharu bernama topik pada jenis Int:

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

4.topics({
   print("扩展模块内")       
})    
    
3.topics({
   print("内型转换模块内")       
})

Hasil keluaran pelaksanaan program di atas ialah:

扩展模块内
扩展模块内
扩展模块内
扩展模块内
内型转换模块内
内型转换模块内
内型转换模块内

Ini topics kaedah menggunakan Satu parameter jenis () -> (), menunjukkan bahawa fungsi tidak mempunyai parameter dan tiada nilai pulangan.

Selepas mentakrifkan sambungan ini, anda boleh memanggil kaedah topics pada mana-mana integer untuk melaksanakan tugas beberapa kali:


Kaedah contoh boleh ubah

Kaedah contoh ditambah dengan sambungan juga boleh mengubah suai kejadian itu sendiri.

Kaedah dalam struktur dan jenis penghitungan yang mengubah suai diri atau sifatnya mesti menandakan kaedah contoh sebagai bermutasi, sama seperti kaedah pengubahsuaian daripada pelaksanaan asal.

Contoh

Contoh berikut menambah kaedah pengubahsuaian baharu yang dinamakan segi empat sama kepada jenis Swift's Double untuk melaksanakan pengiraan kuasa dua bagi nilai primitif:

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

Di Atas Hasil keluaran program pelaksanaan ialah:

圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735

Subskrip

Sambungan boleh menambah subskrip baharu pada jenis sedia ada.

Contoh

Contoh berikut menambahkan subskrip integer pada Int jenis terbina dalam Swift. Subskrip [n] mengembalikan nombor perpuluhan

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

Hasil output pelaksanaan program di atas ialah:

2
6
5

Jenis bersarang

boleh dilanjutkan ke kelas sedia ada, Tambah jenis bersarang baharu kepada struktur dan penghitungan:

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

Hasil output pelaksanaan program di atas ialah:

 10 
 20 
 30 
 40 
 50 
 50