Swift Academy · Oppitunti

Tyyppiparametrien rajoitukset

Edellytä geneeristen parametrien protokollanmukaisuutta.

Oppitunti 1/413 vaihetta

Tyyppiparametrien rajoitukset on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. 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ä 4 oppituntia.

Geneeristen tyyppien kertaus

Geneerinen funktio käyttää tyyppiparametria, kuten <T>, jotta se toimii useiden tyyppien kanssa. Rajoittamatonta T-tyyppiä voi kuitenkin vain välittää eteenpäin, ei tarkastella. Rajoitteet avaavat uusia kyvykkyyksiä.

func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))

Comparable-rajoite

Kirjoittamalla <T: Comparable> varmistatte, että T-tyypin arvot tukevat operaattoreita <, > ja muita vastaavia, joten voitte vertailla niitä.

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
    a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))

Miksi rajoitteita tarvitaan

Ilman Comparable-rajoitetta kääntäjä hylkää lausekkeen a > b, koska kaikki tyypit eivät tue sitä. Rajoite on lupaus, joka tekee operaation käyttämisestä sallittua.

func minOf<T: Comparable>(_ list: [T]) -> T? {
    list.min()
}
print(minOf([4, 2, 8])!)

Equatable-rajoite

Equatable mahdollistaa operaattorit == ja !=. Käyttäkää sitä yhtäsuurten alkioiden laskemiseen tai etsimiseen.

func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
    list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))

Hashable-rajoite

Hashable mahdollistaa arvojen käyttämisen Set-joukon jäseninä tai sanakirjan avaimina.

func unique<T: Hashable>(_ list: [T]) -> [T] {
    Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())

Protokollarajoitteet

Mikä tahansa protokolla voi toimia rajoitteena. Tässä mukautettu protokolla antaa geneeriselle parametrille pääsyn sen menetelmään.

protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }

func announce<T: Speaker>(_ x: T) {
    print(x.speak())
}
announce(Dog())

Luokkarajoitteet

Voitte vaatia, että T perii tietyn luokan, jolloin käytettävissänne ovat kyseisen luokan jäsenet.

class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }

func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())

Useita rajoitteita

Yhdistäkää rajoitteita &-operaattorilla, kun haluatte vaatia useiden protokollien noudattamista kerralla.

func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
    print(a.description, a == b)
}
show(5, 5)

Useita tyyppiparametreja

Funktiolla voi olla useita rajoitettuja parametreja, joilla kullakin on omat vaatimuksensa.

func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
    var d: [K: V] = [:]
    for (k, v) in zip(keys, vals) { d[k] = v }
    return d
}
print(zipMap(["a", "b"], [1, 2]))

Tyyppien rajoitteet

Myös geneeriset tyypit, eivät vain funktiot, voivat sisältää rajoitteita. Geneerinen rakenne voi vaatia, että sen tyyppiparametri noudattaa tiettyä protokollaa.

struct SortedBox<T: Comparable> {
    var items: [T]
    var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)

Numeeriset rajoitteet

Standardiprotokollat, kuten Numeric, mahdollistavat aritmeettiset operaatiot geneerisessä koodissa eri tyyppien, kuten Int- ja Double-tyyppien, välillä.

func sum<T: Numeric>(_ list: [T]) -> T {
    list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))

Pikatesti

Testatkaa, kuinka hyvin ymmärrätte tyyppiparametrien rajoitteet.

Kertaus

Tyyppiparametrien rajoitteet (<T: Protocol> tai <T: SomeClass>) kertovat kääntäjälle, mitä geneerinen tyyppi voi tehdä. Näitte esimerkkeinä Comparable-, Equatable-, Hashable- ja Numeric-protokollat, mukautetut protokollat, luokkarajoitteet, useiden rajoitteiden yhdistämisen &-operaattorilla sekä geneeristen tyyppien rajoitteet.

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 ”Tyyppiparametrien rajoitukset” ilmainen?

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

Mitä opin oppitunnilla ”Tyyppiparametrien rajoitukset”?

Edellytä geneeristen parametrien protokollanmukaisuutta. 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/4.

Kuinka kauan ”Tyyppiparametrien rajoitukset”-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. Tyyppiparametrien rajoitukset
  2. Funktioiden where-lausekkeet
  3. Assosioitujen tyyppien rajoittaminen
  4. Geneeriset alaindeksit ja laajennukset
← Takaisin: Swift Academy