Swift Academy · Oppitunti

Sekalaiset arvo- ja viitegraafit

Luokkia sisältävät rakenteet: piilevä viitesemantiikka ja sen hallinta.

Oppitunti 3/412 vaihetta

Sekalaiset arvo- ja viitegraafit on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Tervetuloa

Struct-tyypit voivat sisältää luokkia tallennettuina ominaisuuksina. Tällöin struct toimii ulospäin arvotyyppinä, mutta jakaa sisäisesti luokkaviitteen — kyseessä on hienovarainen sudenkuoppa.

Luokan sisältävä struct

```swift class Storage { var data: [Int] = [] } struct Container { var storage = Storage() var label: String = "" } var a = Container() var b = a // copies label, but SHARES storage! a.storage.data.append(1) print(b.storage.data) // [1] — shared! ```

Vain arvotyyppiset ominaisuudet kopioidaan

Kun struct kopioidaan: • Arvotyyppiset ominaisuudet (`label: String`) kopioidaan kokonaan • Viitetyyppisistä ominaisuuksista (`storage: Storage`) kopioidaan vain osoitin Tätä kutsutaan *matalaksi kopioksi*.

Syvän kopion tekeminen

```swift struct Container { var storage: Storage func deepCopy() -> Container { let newStorage = Storage() newStorage.data = storage.data // copy values return Container(storage: newStorage, label: label) } } ```

COW apuna

Swiftin omat kokoelmat välttävät tämän käyttämällä COW-mekanismia: ```swift struct SafeContainer { private(set) var storage = Storage() mutating func append(_ n: Int) { if !isKnownUniquelyReferenced(&storage) { storage = storage.copy() // copy before mutating } storage.data.append(n) } } ```

Struct-tyyppejä sisältävät luokat

```swift class ViewModel { var point = CGPoint(x: 0, y: 0) // value type inside reference type } let vm1 = ViewModel() let vm2 = vm1 // same ViewModel! vm1.point.x = 5 print(vm2.point.x) // 5 — shared because ViewModel is a class ```

Identiteetti ja yhtäsuuruus

```swift class Dog { var name: String = "" } let x = Dog() let y = x print(x === y) // true — same object print(x !== y) // false let z = Dog() print(x === z) // false — different objects ```

Rekursiivinen struct luokan kautta

Struct-tyypit eivät voi viitata itseensä, mutta ne voivat sisältää luokan, joka viittaa struct-tyyppiin: ```swift struct Tree { var value: Int var children: [Tree] // OK — Array uses class internally } ```

Odottamattoman jakamisen havaitseminen

Käyttäkää `isKnownUniquelyReferenced`-funktiota ajonaikaisesti jakamisen havaitsemiseen: ```swift var s = Storage() var r: AnyObject = s print(isKnownUniquelyReferenced(&s)) // true var s2 = s print(isKnownUniquelyReferenced(&s)) // false — shared ```

Suunnitteluohjeet

Kun struct-tyypin on sisällettävä muuntuvaa viitetyyppistä tilaa: 1. Toteuttakaa COW palauttaaksenne arvosemantiikan 2. Tai käyttäkää muuttumatonta luokkaa: `let` vastaan `var` luokkaominaisuudessa 3. Tai suunnitelkaa rakenne uudelleen — ehkä struct-tyypin pitäisi olla luokka Dokumentoikaa selkeästi, milloin jakaminen on tarkoituksellista.

Pikatarkistus

Mitä luokalle tapahtuu, kun kopioitte luokkaominaisuuden sisältävän struct-tyypin?

Kertaus

Tärkeimmät asiat: • Struct-kopio on matala — luokkaviitteet jaetaan • `isKnownUniquelyReferenced` havaitsee jakamisen ajonaikaisesti • Toteuttakaa COW palauttaaksenne aidon arvosemantiikan • `===` / `!==` testaavat luokkien olioidentiteettiä • Rekursiivisissa rakenteissa lapset toteutetaan Array-tyypillä (jonka taustalla on luokka) Seuraavaksi: arvosemantiikkaa hyödyntävien API-rajapintojen suunnittelu.
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 ”Sekalaiset arvo- ja viitegraafit” ilmainen?

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

Luokkia sisältävät rakenteet: piilevä viitesemantiikka ja sen hallinta. 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 3/4.

Kuinka kauan ”Sekalaiset arvo- ja viitegraafit”-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. Pino ja kekomuisti: missä arvot sijaitsevat
  2. Muuttaminen, jakaminen ja odottamaton aliasointi
  3. Sekalaiset arvo- ja viitegraafit
  4. Arvosemantiikkaa käyttävien API-rajapintojen suunnittelu
← Takaisin: Swift Academy