Swift Academy · Oppitunti

Oletustoteutukset laajennuksissa

Tarjoa yhteistä toimintaa protokollalaajennusten avulla.

Oppitunti 2/413 vaihetta

Oletustoteutukset laajennuksissa on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.

Ongelma

Protokollat ilmoittavat vaatimukset, mutta eivät tarjoa toimintaa. Jos jokaisen protokollaa noudattavan tyypin pitäisi toistaa sama logiikka, koodia syntyisi päällekkäin. Protokollalaajennukset ratkaisevat ongelman tarjoamalla oletustoteutuksia.

protocol Greeter {
    func greet() -> String
}

Oletustoteutuksen lisääminen

Protokollalaajennus voi toteuttaa vaatimuksen. Protokollaa noudattavat tyypit saavat toiminnallisuuden automaattisesti, elleivät ne korvaa sitä omalla toteutuksellaan.

protocol Greeter { func greet() -> String }

extension Greeter {
    func greet() -> String { "Hello!" }
}

struct Robot: Greeter {}
print(Robot().greet())

Oletustoteutuksen korvaaminen

Protokollaa noudattava tyyppi voi tarjota oman toteutuksensa, joka asetetaan laajennuksen oletustoteutuksen edelle.

protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "Hello!" } }

struct French: Greeter {
    func greet() -> String { "Bonjour!" }
}
print(French().greet())

Lisämenetelmien lisääminen

Laajennukset voivat lisätä kokonaan uusia menetelmiä, joita protokollassa ei ole lainkaan. Jokainen protokollaa noudattava tyyppi saa ne automaattisesti.

protocol Named { var name: String { get } }

extension Named {
    func loudName() -> String { name.uppercased() }
}

struct City: Named { let name: String }
print(City(name: "paris").loudName())

Lasketut oletusominaisuudet

Laajennukset voivat tarjota oletuksena myös laskettuja ominaisuuksia.

protocol Sized {
    var width: Double { get }
    var height: Double { get }
}

extension Sized {
    var area: Double { width * height }
}

struct Rect: Sized { let width: Double; let height: Double }
print(Rect(width: 2, height: 5).area)

Vaatimusten hyödyntäminen

Oletustoteutus voi kutsua protokollan omia vaatimuksia ja koostaa niiden avulla monipuolisempaa toimintaa siitä vähimmäissopimuksesta, jonka jokaisen tyypin on tarjottava.

protocol Summable {
    var values: [Int] { get }
}

extension Summable {
    var total: Int { values.reduce(0, +) }
}

struct Cart: Summable { let values: [Int] }
print(Cart(values: [10, 20, 30]).total)

Rajoitetut laajennukset

Käyttäkää where-ehtoa, jotta oletustoteutusta käytetään vain lisäehtojen täyttyessä. Tässä oletus on olemassa vain, kun Self on myös Equatable.

protocol Container {
    associatedtype Item
    var items: [Item] { get }
}

extension Container where Item: Equatable {
    func contains(_ x: Item) -> Bool { items.contains(x) }
}

struct Bag: Container { let items: [Int] }
print(Bag(items: [1, 2, 3]).contains(2))

Oletustoteutus ja vaatimus yhdessä

Voitte ilmoittaa menetelmän protokollassa JA tarjota sille oletustoteutuksen. Menetelmän ilmoittaminen protokollassa mahdollistaa dynaamisen dispatchin protokollatyypin kautta.

protocol Logger {
    func log() -> String
}
extension Logger {
    func log() -> String { "default log" }
}

struct A: Logger {}
struct B: Logger { func log() -> String { "B log" } }

let loggers: [Logger] = [A(), B()]
for l in loggers { print(l.log()) }

Staattisen dispatchin huomio

Jos menetelmä on VAIN laajennuksessa, ei protokollassa, protokollatyyppisen arvon kautta tehdyt kutsut käyttävät laajennuksen versiota, vaikka konkreettinen tyyppi olisi määritellyt oman versionsa. Ilmoittakaa menetelmä protokollassa dynaamista dispatchia varten.

protocol P {}
extension P { func who() -> String { "P-default" } }
struct Q: P { func who() -> String { "Q" } }

let direct = Q()
let asP: P = Q()
print(direct.who())
print(asP.who())

Toistokoodin vähentäminen

Pienen vaaditun rajapinnan ja monipuolisten oletustoteutusten yhdistelmä on protokollakeskeisen suunnittelun ydin: protokollaa noudattavat tyypit toteuttavat vain vähimmäisvaatimukset, ja jaettu toiminta sijaitsee yhdessä paikassa.

protocol Identifiable { var id: Int { get } }
extension Identifiable {
    var tag: String { "ID-" + String(id) }
}
struct Order: Identifiable { let id: Int }
print(Order(id: 7).tag)

Useiden laajennusten yhdistäminen

Voitte jakaa oletustoteutukset useisiin laajennuksiin koodin järjestämistä varten. Ne kaikki vaikuttavat protokollaa noudattavaan tyyppiin.

protocol Money { var cents: Int { get } }
extension Money { var dollars: Double { Double(cents) / 100 } }
extension Money { var label: String { "$" + String(format: "%.2f", dollars) } }

struct Price: Money { let cents: Int }
print(Price(cents: 1299).label)

Pikatarkistus

Testatkaa ymmärrystänne protokollalaajennusten oletustoteutuksista.

Kertaus

Protokollalaajennukset tarjoavat oletustoteutuksia, joiden ansiosta protokollaa noudattavat tyypit voivat periä jaetun toiminnan ja korvata sen tarvittaessa. Voitte lisätä lisämenetelmiä ja laskettuja ominaisuuksia, rajoittaa oletustoteutuksia where-ehdolla ja hyödyntää staattisen ja dynaamisen dispatchin sääntöä: ilmoittakaa menetelmä protokollassa dynaamista dispatchia varten.

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 ”Oletustoteutukset laajennuksissa” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Oletustoteutukset laajennuksissa”. 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 ”Oletustoteutukset laajennuksissa”?

Tarjoa yhteistä toimintaa protokollalaajennusten avulla. 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 2/4.

Kuinka kauan ”Oletustoteutukset laajennuksissa”-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