Swift Academy · Oppitunti

associatedtype ja geneeriset protokollat

Määritelkää protokollia associatedtype -määritteellä, tutustukaa siihen, miten mukautuvat tyypit sitovat ne, ja käyttäkää geneerisiä funktioita protokollarajoitteilla.

Oppitunti 1/38 vaihetta

associatedtype ja geneeriset protokollat on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.

Miksi assosioituja tyyppejä?

Protokollat voivat olla geneerisiä associatedtype-määreen avulla. Protokollaa noudattavat tyypit sitovat paikanvaraajan konkreettiseen tyyppiin.

Protokolla ja associatedtype

associatedtype Item toimii tyyppiparametrin tavoin. Vaatimuksissa sitä voidaan käyttää metodeissa, alaindekseissä ja ominaisuuksissa.

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(index: Int) -> Item { get }
}

Konkreettinen protokollan noudattaminen

Protokollaa noudattava tyyppi valitsee konkreettisen Item-tyypin, tässä tapauksessa Int-tyypin, toteuttamalla vaatimukset kyseisellä tyypillä.

struct IntStack: Container {
    // Binds Item == Int implicitly by usage
    private var items: [Int] = []
    mutating func append(_ item: Int) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Int { items[index] }
}
var st = IntStack()
st.append(10); st.append(20)
print(st.count, st[1])

Geneerinen protokollan noudattaja

Geneerinen tyyppi voi noudattaa protokollaa sitomalla Item == Element -ehdon, jolloin protokolla säilyy geneerisenä ja uudelleenkäytettävänä.

struct Stack<Element>: Container {
    private var items: [Element] = []
    mutating func append(_ item: Element) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Element { items[index] }
    // Here, associatedtype Item == Element
}
var s = Stack<String>()
s.append("hi"); s.append("bye")
print(s.count, s[1])

Protokollan käyttäminen geneerisissä tyypeissä

Rajoittakaa funktioita ehdolla C: Container. Voitte käyttää tyyppiä C.Item abstraktisti sitomatta sitä tiettyyn tyyppiin.

// Generic algorithm operating on any Container
func dumpFirstTwo<C: Container>(_ c: C) {
    // We can talk about C.Item but not assume concrete type
    if c.count >= 2 {
        print("0:", c[0])
        print("1:", c[1])
    } else {
        print("too few elements")
    }
}
dumpFirstTwo(s)    // works with Stack<String>
dumpFirstTwo(st)   // works with IntStack

Huomautuksia ja vinkkejä

Huomautuksia:

  • Assosioituja tyyppejä sisältäviä protokollia ei voi käyttää suoraan tyyppeinä; suosikaa geneerisiä tyyppejä tai tyypin häivytystä.
  • Nimetkää paikanvaraajat selkeästi (Item, Element).
  • Protokollan noudattaminen voidaan ilmoittaa eksplisiittisesti (typealias Item = ...) tai päätellä allekirjoituksista.

associatedtypen merkitys

Pikatarkistus: Mitä associatedtype tarkoittaa?

Kertaus

Kertaus: Käyttäkää associatedtype-määrettä protokollien tekemiseen geneerisiksi. Protokollaa noudattavat tyypit valitsevat konkreettisen tyypin, ja geneeriset funktiot voivat toimia minkä tahansa protokollan noudattajan kanssa rajoitteiden avulla.

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 ”associatedtype ja geneeriset protokollat” ilmainen?

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

Määritelkää protokollia associatedtype -määritteellä, tutustukaa siihen, miten mukautuvat tyypit sitovat ne, ja käyttäkää geneerisiä funktioita protokollarajoitteilla. 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/3.

Kuinka kauan ”associatedtype ja geneeriset protokollat”-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. associatedtype ja geneeriset protokollat
  2. Tyypin häivytyksen mallit (AnySequence/AnyIterator)
  3. Milloin käyttää existentials-tyyppejä (any P) ja milloin generiikkaa
← Takaisin: Swift Academy