Gubahan Protokol
Gabungkan beberapa keperluan protokol dengan &.
Gubahan Protokol ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.
Menggabungkan Protokol
Kadang-kadang sesuatu nilai mesti mematuhi beberapa protokol serentak. Swift membolehkan anda menggabungkan protokol dengan operator &: SomeProtocol & AnotherProtocol.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }Parameter Gabungan
Parameter berjenis Named & Aged menerima apa-apa nilai yang mematuhi kedua-dua protokol.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func intro(_ x: Named & Aged) {
print(x.name + " is " + String(x.age))
}
intro(Person(name: "Sam", age: 28))Mengapa Bukan Pewarisan?
composition membolehkan anda memerlukan kedua-dua protokol di tapak panggilan tanpa mencipta protokol gabungan baharu. Ini mengekalkan protokol supaya kecil dan boleh digunakan semula.
protocol Drawable { func draw() -> String }
protocol Resizable { func resize(_ f: Double) -> String }
struct Icon: Drawable, Resizable {
func draw() -> String { "drawing" }
func resize(_ f: Double) -> String { "x" + String(f) }
}
func render(_ v: Drawable & Resizable) {
print(v.draw(), v.resize(2))
}
render(Icon())Tiga atau Lebih
Anda boleh merangkaikan seberapa banyak protokol yang diperlukan dengan operator & tambahan.
protocol A { func a() -> String }
protocol B { func b() -> String }
protocol C { func c() -> String }
struct X: A, B, C {
func a() -> String { "a" }
func b() -> String { "b" }
func c() -> String { "c" }
}
func use(_ v: A & B & C) { print(v.a(), v.b(), v.c()) }
use(X())composition dengan Kelas
Anda boleh menggabungkan jenis kelas dengan protokol: SomeClass & SomeProtocol memerlukan nilai itu ialah kelas tersebut (atau subkelasnya) AND mematuhi protokol.
class Vehicle { var speed = 0 }
protocol Electric { var battery: Int { get } }
class Tesla: Vehicle, Electric { var battery = 100 }
func check(_ v: Vehicle & Electric) {
print(v.speed, v.battery)
}
check(Tesla())Mengembalikan composition
Sesuatu fungsi boleh mengembalikan jenis gabungan, dengan menjanjikan kepada pemanggil bahawa hasilnya mematuhi semua protokol yang disenaraikan.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged { let name: String; let age: Int }
func makePerson() -> Named & Aged {
Person(name: "Eve", age: 22)
}
let p = makePerson()
print(p.name, p.age)typealias untuk composition
Berikan nama yang mudah dibaca kepada composition dengan typealias supaya anda boleh menggunakannya semula tanpa mengulangi rangkaian &.
protocol Codable2 { func encode() -> String }
protocol Loggable { func log() -> String }
typealias Persistable = Codable2 & Loggable
struct Record: Persistable {
func encode() -> String { "data" }
func log() -> String { "logged" }
}
func save(_ r: Persistable) { print(r.encode(), r.log()) }
save(Record())composition dalam Koleksi
Anda boleh menyimpan nilai jenis gabungan dalam tatasusunan, lalu mengakses semua ahli protokol pada setiap elemen.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct P: Named, Aged { let name: String; let age: Int }
let group: [Named & Aged] = [P(name: "A", age: 1), P(name: "B", age: 2)]
for g in group { print(g.name, g.age) }composition dengan Protokol Standard
composition sangat berguna dengan protokol pustaka. Contohnya, perlukan kedua-dua CustomStringConvertible dan Equatable.
func report<T>(_ items: [T]) where T: CustomStringConvertible & Equatable {
for i in items { print(i.description) }
}
report([1, 2, 3])Protokol Kosong sebagai Penanda
Komposisi boleh menggabungkan protokol penanda (tanpa keperluan) dengan protokol fungsian untuk menyatakan tujuan dalam sistem jenis.
protocol Secure {}
protocol Sendable2 { func send() -> String }
struct Packet: Secure, Sendable2 {
func send() -> String { "sent securely" }
}
func transmit(_ p: Secure & Sendable2) { print(p.send()) }
transmit(Packet())Komposisi berbanding Generik
Komposisi (A & B) menghapuskan jenis konkrit; generik (<T: A & B>) mengekalkannya. Gunakan generik apabila anda perlu mengaitkan jenis parameter dengan jenis pulangan.
protocol A { func a() -> String }
protocol B { func b() -> String }
struct S: A, B { func a() -> String { "a" }; func b() -> String { "b" } }
func generic<T: A & B>(_ x: T) -> T { print(x.a(), x.b()); return x }
_ = generic(S())Semakan Ringkas
Uji pemahaman anda tentang komposisi protokol.
Ringkasan
Komposisi protokol dengan & membolehkan anda mewajibkan pematuhan kepada berbilang protokol (dan secara pilihan satu kelas) serentak, tanpa mentakrifkan protokol gabungan baharu. Anda boleh menamakan komposisi dengan typealias, menggunakannya dalam parameter, nilai pulangan dan koleksi, serta melihat perbezaan komposisi dengan generik dalam mengekalkan jenis konkrit.
Pelajari Swift dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 122
- Pelajaran
- 409
Soalan Lazim
Adakah pelajaran “Gubahan Protokol” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Gubahan Protokol”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Gubahan Protokol”?
Gabungkan beberapa keperluan protokol dengan &. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Gubahan Protokol” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.