associatedtype ja geneeriset protokollat
Määritelkää protokollia associatedtype -määritteellä, tutustukaa siihen, miten mukautuvat tyypit sitovat ne, ja käyttäkää geneerisiä funktioita protokollarajoitteilla.
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 IntStackHuomautuksia 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.
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
- associatedtype ja geneeriset protokollat
- Tyypin häivytyksen mallit (AnySequence/AnyIterator)
- Milloin käyttää existentials-tyyppejä (any P) ja milloin generiikkaa