Swift Academy · Oppitunti

Protokollat sopimuksina

Määritä toiminnan sopimuksia tyypeistä riippumatta.

Oppitunti 1/413 vaihetta

Protokollat sopimuksina on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on protokolla?

Protokolla määrittää mallin menetelmistä, ominaisuuksista ja muista vaatimuksista, jotka sitä noudattavan tyypin on toteutettava. Se on sopimus: protokollan käyttöön ottava tyyppi lupaa tarjota kaiken protokollassa määritellyn.

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

Protokollan noudattaminen

Tyyppi noudattaa protokollaa ottamalla sen käyttöön ja tarjoamalla jokaisen vaatimuksen toteutuksen. Tässä struct toteuttaa sekä name-ominaisuuden että greet()-menetelmän.

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

Ominaisuusvaatimukset

Protokollat määrittävät, täytyykö ominaisuuden olla luettavissa ({ get }) vai sekä luettavissa että asetettavissa ({ get set }). Tallennettu tai laskettu ominaisuus voi täyttää vain lukemista vaativan vaatimuksen.

protocol Identifiable {
    var id: String { get }
}

struct User: Identifiable {
    let id: String
}

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

Menetelmävaatimukset

Menetelmävaatimuksissa luetellaan nimi, parametrit ja palautustyyppi, mutta ei runkoa. Protokollaa noudattavat tyypit tarjoavat toteutuksen.

protocol Shape {
    func area() -> Double
}

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

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

mutating-vaatimukset

Arvotyypeissä menetelmät, jotka muuttavat self-arvoa, on merkittävä mutating-määritteellä. Ilmoittakaa vaatimus mutating-määritteellä, jotta struct-tyypit voivat täyttää sen.

protocol Toggleable {
    mutating func toggle()
}

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

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

Protokollat tyyppeinä

Protokolla on täysiverinen tyyppi. Voitte käyttää sitä muuttujien, parametrien ja palautusarvojen tyyppinä, jolloin mikä tahansa protokollaa noudattava arvo hyväksytään.

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()) }

Polymorfismi protokollien avulla

Protokollan menetelmää kutsuttaessa kutsu välitetään arvon taustalla olevalle konkreettiselle tyypille. Näin voitte kirjoittaa koodia, joka toimii monien tyyppien kanssa yhden sopimuksen kautta.

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

Alustajavaatimukset

Protokollat voivat vaatia alustajia. Luokkien on merkittävä toteutus required-määritteellä, jotta aliluokat tarjoavat sen myös.

protocol FromInt {
    init(value: Int)
}

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

print(Wrapper(value: 42).value)

Protokollaperintä

Protokolla voi periä yhden tai useamman muun protokollan ja lisätä perittyjen vaatimusten lisäksi omia vaatimuksia.

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)

Vain luokille tarkoitetut protokollat

Merkitkää protokolla AnyObject-määritteellä, jos haluatte rajoittaa sen noudattamisen luokkiin. Tämä on hyödyllistä viitesemantiikkaa vaativissa tapauksissa, kuten delegoinnissa.

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

class Box: Counter {
    var count = 0
}

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

Noudattamisen tarkistaminen

Käyttäkää is- ja as?-operaattoreita tarkistamaan suorituksen aikana, noudattaako arvo protokollaa.

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

Pikatarkistus

Testatkaa ymmärrystänne protokollavaatimuksista.

Kertaus

Opitte, että protokolla on sopimus: se ilmoittaa ominaisuus-, menetelmä-, mutating- ja alustajavaatimukset ilman toteutuksia. Tyypit noudattavat protokollaa täyttämällä kaikki sen vaatimukset. Protokollia voidaan käyttää tyyppeinä polymorfismiin, ne voivat periä muita protokollia, ja niiden noudattamisen voi rajoittaa luokkiin AnyObject-määritteellä.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Protokollat sopimuksina” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Protokollat sopimuksina”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Protokollat sopimuksina”?

Määritä toiminnan sopimuksia tyypeistä riippumatta. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Protokollat sopimuksina”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Protokollat sopimuksina
  2. Oletustoteutukset laajennuksissa
  3. Protokollien koostaminen
  4. Ehdollinen protokollanmukaisuus
← Takaisin: Swift Academy