Tyyppiparametrien rajoitukset
Edellytä geneeristen parametrien protokollanmukaisuutta.
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.
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
- Tyyppiparametrien rajoitukset
- Funktioiden where-lausekkeet
- Assosioitujen tyyppien rajoittaminen
- Geneeriset alaindeksit ja laajennukset