Swift Academy · Oppitunti

Protokollalaajennukset ja tyyppilaajennukset

Verratkaa protokollalaajennuksia (oletustoteutusten lisääminen protokollaan, myös ehdollisesti) tyyppilaajennuksiin (API:en lisääminen yhteen konkreettiseen tyyppiin). Ymmärtäkää dispatch-käyttäytyminen ja rajoitteet.

Oppitunti 2/38 vaihetta

Protokollalaajennukset ja tyyppilaajennukset on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/3. 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ä 3 oppituntia.

Yleiskatsaus

Tavoite: Opettele, milloin käyttää protokollalaajennusta (oletustoiminta kaikille protokollan mukaisille tyypeille) ja milloin tyyppilaajennusta (yhden konkreettisen tyypin API:t). Lisäksi tarkastellaan dispatch-sääntöjä.

Protokolla ja konformanssi

Protokollat määrittävät vaatimukset. Tyypit noudattavat protokollaa toteuttamalla nämä vaatimukset.

protocol Greeter {
    func greet() -> String
}
struct Person: Greeter {
    var name: String
    func greet() -> String { "Hi, I'm \\(name)" }  // concrete requirement impl
}
print(Person(name: "Ada").greet())

Oletustoteutukset protokollalaajennuksilla

Protokollalaajennus voi tarjota oletustoteutuksia, joita kaikki protokollan mukaiset tyypit käyttävät, elleivät ne tarjoa omia toteutuksiaan.

protocol Describable {
    func describe() -> String
}
extension Describable {
    // default for ALL conformers until they override
    func describe() -> String { "No description" }
}

struct Car: Describable { }             // uses default
struct Book: Describable {
    func describe() -> String { "A book" } // custom override
}
print(Car().describe(), Book().describe())

Tyyppilaajennusten API:t

Tyyppilaajennukset lisäävät metodeja ja laskettuja ominaisuuksia yhteen konkreettiseen tyyppiin. Ne eivät lisää tallennettuja ominaisuuksia.

struct Point { var x: Int; var y: Int }

extension Point {
    // add helper just to Point
    var lengthSquared: Int { x*x + y*y }
    func moved(dx: Int, dy: Int) -> Point { Point(x: x+dx, y: y+dy) }
}
let p = Point(x: 2, y: 3)
print(p.lengthSquared, p.moved(dx: 1, dy: -1))

Ehdolliset laajennukset

Lisää toiminnallisuutta joillekin protokollan mukaisille tyypeille käyttämällä protokollalaajennuksen where-ehtoa.

protocol Summable { }
extension Int: Summable { }
extension Array where Element: Summable {
    // only for arrays whose elements conform to Summable
    func joinedCount() -> Int { self.count }
}
print([1,2,3].joinedCount())   // works (Int conforms)
 // print(["a","b"].joinedCount()) // not available

Dispatch-toiminta (yleiskatsaus)

Nyrkkisääntö: Jos metodi on protokollavaatimus ja protokollan mukainen tyyppi toteuttaa sen, tyypin oma toteutus voittaa (dynaamisen kutsunohjauksen tapaan). Vain protokollalaajennuksessa määritetyt metodit, jotka eivät ole vaatimuksia, käyttävät staattista kutsunohjausta.

protocol Speaker { func speak() -> String }
extension Speaker { func speak() -> String { "default" } }

struct Cat: Speaker { }
struct Dog: Speaker {
    func speak() -> String { "woof" } // requirement impl overrides default
}

let s1: Speaker = Cat()
let s2: Speaker = Dog()
print(s1.speak()) // "default" (uses default impl)
print(s2.speak()) // "woof" (Dog provides requirement impl)

let c = Cat()
print(c.speak())  // "default" via extension on protocol

Protokolla- vai tyyppilaajennus

Pikatarkistus: Mikä on keskeinen ero?

Kertaus

Kertaus: Käytä protokollalaajennuksia uudelleenkäytettäviin oletuksiin, tarvittaessa ehdollisesti. Käytä tyyppilaajennuksia yhden tyypin laajentamiseen. Muista kutsunohjaus: vaatimusten toteutukset ohittavat laajennusten oletusmetodit.

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 ”Protokollalaajennukset ja tyyppilaajennukset” ilmainen?

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

Mitä opin oppitunnilla ”Protokollalaajennukset ja tyyppilaajennukset”?

Verratkaa protokollalaajennuksia (oletustoteutusten lisääminen protokollaan, myös ehdollisesti) tyyppilaajennuksiin (API:en lisääminen yhteen konkreettiseen tyyppiin). Ymmärtäkää dispatch-käyttäytymi… 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/3.

Kuinka kauan ”Protokollalaajennukset ja tyyppilaajennukset”-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. Protokollien ja laajennusten perusteet
  2. Protokollalaajennukset ja tyyppilaajennukset
  3. Staattiset ja instanssivaatimukset
← Takaisin: Swift Academy