Swift Academy · Pelajaran

Gubahan Protokol

Gabungkan beberapa keperluan protokol dengan &.

Pelajaran 3 daripada 413 langkah

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.

Percuma untuk bermula

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.

Semua pelajaran dalam kursus ini

  1. Protokol sebagai Kontrak
  2. Pelaksanaan Lalai dalam Extension
  3. Gubahan Protokol
  4. Pematuhan Bersyarat
← Kembali ke Swift Academy