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