Swift Academy · Oppitunti

Tyyppien tarkistaminen is-operaattorilla

Tarkista ilmentymän tyyppi ennen tyypinmuunnosta.

Oppitunti 4/413 vaihetta

Tyyppien tarkistaminen is-operaattorilla on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.

is-operaattori

Tyyppitarkistusoperaattori is palauttaa Bool-arvon, joka kertoo, onko instanssi tiettyä tyyppiä tai sen alityyppiä. Se ei tee muunnosta, vaan ainoastaan testaa tyypin.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print(a is Dog)
print(a is Cat)

Alityyppiin kuulumisen testaaminen

is on tosi, kun instanssi on täsmälleen kyseistä tyyppiä tai mitä tahansa sen aliluokkaa. Dog on Animal.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print(a is Animal)
print(a is Dog)

is-operaattorin käyttäminen ehdoissa

Voitte haarauttaa ohjelman kulkua tyyppitarkistuksen perusteella if-rakenteella ja valita toiminnan ajonaikaisen tyypin mukaan.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Cat(name: "Mia")
if a is Cat {
    print("It is a cat")
} else {
    print("Not a cat")
}

Kokoelman tyyppien laskeminen

is-operaattoria voi hyödyntää esimerkiksi laskemalla, kuinka moni alkio vastaa tiettyä tyyppiä sisältävässä eri tyyppien taulukossa.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
let dogCount = zoo.filter { $0 is Dog }.count
print("Dogs:", dogCount)

is protokollien kanssa

is tarkistaa myös, noudattaako instanssi tiettyä protokollaa, ja palauttaa true, jos se noudattaa sitä.

protocol Flyer {}
class Bird: Flyer {}
class Fish {}
let creatures: [Any] = [Bird(), Fish()]
for c in creatures { print(c is Flyer) }

is vai as?

is vastaa vain kyllä tai ei. as? menee pidemmälle ja antaa arvon käyttöönne, jos tarvitsette aliluokan jäseniä.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
print("Check only:", a is Dog)
if let d = a as? Dog { print("Use it:", d.bark()) }

Tarkistaminen is-operaattorilla

Käyttäkää is-operaattoria guard-rakenteessa, jotta voitte poistua heti, jos instanssi ei ole odotettua tyyppiä.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func onlyForCats(_ a: Animal) {
    guard a is Cat else {
        print("Skipping non-cat")
        return
    }
    print("Processing a cat")
}
onlyForCats(Cat(name: "Mia"))
onlyForCats(Dog(name: "Rex"))

is-operaattorin yhdistäminen switch-rakenteeseen

Voitte käsitellä tyyppitarkistuksia epäsuorasti switch-rakenteella, mutta useita tyyppejä käsiteltäessä case is -kuviovertailu on selkeä tapa.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let items: [Any] = [Dog(name: "Rex"), 42, "hello"]
for item in items {
    switch item {
    case is Dog: print("a dog")
    case is Int: print("an integer")
    default: print("something else")
    }
}

is tarkistaa ajonaikaisen tyypin

is tutkii todellisen ajonaikaisen tyypin, ei muuttujalle ilmoitettua tyyppiä. Animal-tyyppinen muuttuja, joka sisältää Dog-olion, läpäisee tarkistuksen is Dog.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let declaredAsAnimal: Animal = Dog(name: "Rex")
print("Runtime is Dog:", declaredAsAnimal is Dog)

Tarkistaminen ennen pakotettua tyyppimuunnosta

Turvallinen toimintatapa on tarkistaa tyyppi is-operaattorilla ja käyttää vasta sen jälkeen as!-operaattoria, koska tyyppi on tällöin varmistettu.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog {
    let d = a as! Dog
    print(d.bark())
}

Tyyppitarkistuksen yhteenvetoesimerkki

Yhdessä tarkistamiseen käytettävä is ja tyyppimuunnokseen käytettävä as? muodostavat kattavan ja turvallisen työkalupakin ajonaikaisten tyyppien käsittelyyn.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
for a in zoo {
    if a is Dog { print("dog:", a.name) }
    if a is Cat { print("cat:", a.name) }
}

Pikatarkistus

Palauttakaa mieleenne, mitä is-operaattori palauttaa.

Kertaus: tyyppien tarkistaminen is-operaattorilla

Opitte, että is palauttaa Bool-arvon, jolla voidaan tarkistaa kuuluminen ajonaikaiseen tyyppiin, myös aliluokat ja protokollan noudattaminen mukaan lukien, että se sopii hyvin yhteen suodatuksen ja switch case is -rakenteen kanssa ja että is-tarkistus ennen as!-operaattoria tekee pakotetusta tyyppimuunnoksesta turvallisen.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
print("Cats:", zoo.filter { $0 is Cat }.count)
print("Dogs:", zoo.filter { $0 is Dog }.count)
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 ”Tyyppien tarkistaminen is-operaattorilla” ilmainen?

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

Tarkista ilmentymän tyyppi ennen tyypinmuunnosta. 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 4/4.

Kuinka kauan ”Tyyppien tarkistaminen is-operaattorilla”-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. Ylä- ja alityypityksen perusteet
  2. Ehdollinen tyypinmuunnos as?-operaattorilla
  3. Pakotettu tyypinmuunnos as!-operaattorilla ja sen riskit
  4. Tyyppien tarkistaminen is-operaattorilla
← Takaisin: Swift Academy