Swift Academy · Pelajaran

Protokol sebagai Kontrak

Tentukan kontrak tingkah laku secara bebas daripada jenis.

Pelajaran 1 daripada 413 langkah

Protokol sebagai Kontrak ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 1 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.

Apakah Protokol?

Protokol mentakrifkan pelan kaedah, sifat dan keperluan lain yang mesti dilaksanakan oleh jenis yang mematuhinya. Ia ialah kontrak: apa-apa jenis yang mengadopsinya berjanji untuk menyediakan segala yang diisytiharkan oleh protokol.

protocol Greetable {
    var name: String { get }
    func greet() -> String
}

Mematuhi Protokol

Sesuatu jenis mematuhi protokol dengan mengadopsinya dan menyediakan setiap keperluan. Di sini, struktur memenuhi kedua-dua sifat name dan kaedah greet().

protocol Greetable {
    var name: String { get }
    func greet() -> String
}

struct Person: Greetable {
    let name: String
    func greet() -> String { "Hello, I am " + name }
}

let p = Person(name: "Ada")
print(p.greet())

Keperluan Sifat

Protokol menyatakan sama ada sesuatu sifat mesti boleh dibaca ({ get }) atau boleh dibaca dan ditetapkan ({ get set }). Sifat tersimpan atau sifat terhitung boleh memenuhi keperluan baca sahaja.

protocol Identifiable {
    var id: String { get }
}

struct User: Identifiable {
    let id: String
}

print(User(id: "u-1").id)

Keperluan Kaedah

Keperluan kaedah menyenaraikan nama, parameter dan jenis pemulangan, tetapi tiada badan. Jenis yang mematuhi protokol menyediakan pelaksanaannya.

protocol Shape {
    func area() -> Double
}

struct Square: Shape {
    let side: Double
    func area() -> Double { side * side }
}

print(Square(side: 3).area())

Keperluan Pengubahsuaian

Bagi jenis nilai, kaedah yang mengubah self mesti ditandai dengan mutating. Isytiharkan keperluan itu dengan mutating supaya struktur boleh memenuhinya.

protocol Toggleable {
    mutating func toggle()
}

struct Switch: Toggleable {
    var isOn = false
    mutating func toggle() { isOn.toggle() }
}

var s = Switch()
s.toggle()
print(s.isOn)

Protokol sebagai Jenis

Protokol ialah jenis kelas pertama. Anda boleh menggunakannya untuk variable, parameter dan nilai pemulangan, serta menerima apa-apa nilai yang mematuhinya.

protocol Animal { func sound() -> String }
struct Dog: Animal { func sound() -> String { "Woof" } }
struct Cat: Animal { func sound() -> String { "Meow" } }

let animals: [Animal] = [Dog(), Cat()]
for a in animals { print(a.sound()) }

Polimorfisme melalui Protokol

Memanggil kaedah protokol menghantar pelaksanaan kepada jenis konkrit di sebalik nilai tersebut. Ini membolehkan anda menulis kod yang berfungsi merentasi banyak jenis melalui satu kontrak.

protocol Describable { func describe() -> String }
struct Book: Describable { let t: String; func describe() -> String { "Book: " + t } }
struct Film: Describable { let t: String; func describe() -> String { "Film: " + t } }

func show(_ d: Describable) { print(d.describe()) }
show(Book(t: "Swift"))
show(Film(t: "Inception"))

Keperluan Pemula

Protokol boleh memerlukan pemula. Kelas mesti menandai pelaksanaan dengan required supaya subkelas turut menyediakannya.

protocol FromInt {
    init(value: Int)
}

struct Wrapper: FromInt {
    let value: Int
    init(value: Int) { self.value = value }
}

print(Wrapper(value: 42).value)

Pewarisan Protokol

Protokol boleh mewarisi daripada satu atau lebih protokol lain, sambil menambahkan keperluan tambahan di atas keperluan yang diwarisi.

protocol Named { var name: String { get } }
protocol Aged: Named { var age: Int { get } }

struct Member: Aged {
    let name: String
    let age: Int
}

let m = Member(name: "Lin", age: 30)
print(m.name, m.age)

Protokol Khusus Kelas

Tandai protokol dengan AnyObject untuk mengehadkan pematuhan kepada kelas, yang berguna bagi keperluan semantik rujukan seperti perwakilan.

protocol Counter: AnyObject {
    var count: Int { get set }
}

class Box: Counter {
    var count = 0
}

let b = Box()
b.count = 5
print(b.count)

Menyemak Pematuhan

Gunakan is dan as? untuk menguji sama ada sesuatu nilai mematuhi protokol pada masa jalan.

protocol Flyer { func fly() }
struct Bird: Flyer { func fly() { print("flap") } }
struct Rock {}

let things: [Any] = [Bird(), Rock()]
for t in things {
    if let f = t as? Flyer { f.fly() } else { print("grounded") }
}

Semakan Pantas

Uji pemahaman anda tentang keperluan protokol.

Ringkasan

Anda telah mempelajari bahawa protokol ialah kontrak: ia mengisytiharkan keperluan sifat, kaedah, pengubahsuaian dan pemula tanpa pelaksanaan. Jenis mematuhi protokol dengan memenuhi setiap keperluan, protokol boleh digunakan sebagai jenis untuk polimorfisme, boleh mewarisi daripada protokol lain, dan boleh dihadkan kepada kelas dengan AnyObject.

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 “Protokol sebagai Kontrak” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Protokol sebagai Kontrak”, 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 “Protokol sebagai Kontrak”?

Tentukan kontrak tingkah laku secara bebas daripada jenis. 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 1 daripada 4.

Berapa lamakah pelajaran “Protokol sebagai Kontrak” 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