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.
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 availableDispatch-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 protocolProtokolla- 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.
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
- Protokollien ja laajennusten perusteet
- Protokollalaajennukset ja tyyppilaajennukset
- Staattiset ja instanssivaatimukset