Swift Academy · Oppitunti

Tyypin häivytyksen mallit (AnySequence/AnyIterator)

Käyttäkää AnySequence - ja AnyIterator -tyyppejä konkreettisten sekvenssi- ja iteraattorityyppien häivyttämiseen, jotta API:t voivat palauttaa ”T-alkioiden sekvenssin” paljastamatta toteutusta.

Oppitunti 2/38 vaihetta

Tyypin häivytyksen mallit (AnySequence/AnyIterator) 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.

Miksi tyypin häivytystä?

Tyypin häivytys piilottaa konkreettiset tyypit vakaan kääreen taakse. AnySequence- ja AnyIterator-tyyppien avulla voitte palauttaa ”alkioiden sekvenssin” paljastamatta sisäistä rakennetta.

Rajoitus

Sequence-protokollalla on assosioitu tyyppi (Element), joten protokollaa sellaisenaan ei voi käyttää konkreettisena arvotyyppinä. Tarvitsemme kääreen.

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

AnySequence-kääre

AnySequence käärii minkä tahansa konkreettisen sekvenssin (Array, Set tai mukautetun sekvenssin) ja tarjoaa yhdenmukaisen tyypin, kuten AnySequence<Int>.

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

AnyIterator-kääre

AnyIterator käärii alkioita tuottavan sulkeuman. Käärikää se AnySequence-tyypin sisään, jotta voitte tarjota kokonaisen sekvenssin.

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

Yhtenäinen palautustyyppi

Tyypin häivytyksen avulla yksi funktio voi palauttaa erilaisia toteutuksia yhden vakaan palautustyypin (AnySequence<Int>) kautta.

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

Milloin sitä käytetään

Käyttäkää type erasurea, kun:

  • Haluatte piilottaa sekvenssien ja iteraattorien toteutustiedot.
  • Rajapintojen on palautettava sama tyyppi sisäisistä haaroista riippumatta.
  • Geneeriset tyypit paljastuvat liikaa rajapinnoilla.

Huomioita: suosikaa moduulien sisällä suorituskyvyn ja selkeyden vuoksi geneerisiä tyyppejä; käyttäkää rajapinnoilla tarvittaessa AnySequence/AnyIterator-tyyppejä.

AnySequencen tarkoitus

Pikatarkistus: Mitä hyötyä AnySequence<T> tarjoaa?

Kertaus

Kertaus: Kääri konkreettiset sekvenssit ja iteraattorit AnySequence- ja AnyIterator-tyypeillä häivyttääksesi tyypit ja palauttaaksesi joustavista rajapinnoista “T:n sekvenssin”.

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 ”Tyypin häivytyksen mallit (AnySequence/AnyIterator)” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Tyypin häivytyksen mallit (AnySequence/AnyIterator)”. 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 ”Tyypin häivytyksen mallit (AnySequence/AnyIterator)”?

Käyttäkää AnySequence - ja AnyIterator -tyyppejä konkreettisten sekvenssi- ja iteraattorityyppien häivyttämiseen, jotta API:t voivat palauttaa ”T-alkioiden sekvenssin” paljastamatta toteutusta. 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 ”Tyypin häivytyksen mallit (AnySequence/AnyIterator)”-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