💨

【DAY10】100 Days of SwiftUI -structs, computed properties, and property

2023/01/06に公開

はじめに

iOSアプリ界隈で(たぶん)有名なPaul Hudsonさんが無料で公開しているSwiftUIの100日学習コースを進めてみます。学習記録及び備忘録がてらにつらつらと書いてみます。
100 Days of SwiftUI

学んだこと

序盤はSwiftUIは関係なくSwiftという言語の言語仕様のお話。このあたりから少し難しくなってくる。

構造体

一般的な構造体と同じ。

struct Album {
    let title: String
    let artist: String
    let year: Int

    func printSummary() {
        print("\(title) (\(year)) by \(artist)")
    }
}

let red = Album(title: "Red", artist: "Taylor Swift", year: 2012)
let wings = Album(title: "Wings", artist: "BTS", year: 2016)

print(red.title)  // 出力: Red
print(wings.artist)  // 出力: BTS

red.printSummary()  // 出力: Red (2012) by Taylor Swift
wings.printSummary()  // 出力: Wings (2016) by BTS

構造体内のデータを書き換えるような処理を入れる場合はmutatingでマークする必要がある。

struct Employee {
    let name: String
    var vacationRemaining: Int
    
    mutating func takeVacation(days: Int) {
        if vacationRemaining > days {
            vacationRemaining -= days
            print("I'm going on vacation!")
            print("Days remaining: \(vacationRemaining)")
        } else {
            print("Oops! There aren't enough days remainig.")
        }
    }
}

プロパティオブザーバ

構造体内の変数(プロパティ)の値が変わる際に特定の処理を行う機能をプロパティオブザーバーという。プロパティの変更前に処理を入れる場合はwillSet、変更後に処理を入れる場合はdidSetを用いる。このとき、newValue、oldValueが自動的に生成されそれぞれ変更前の値と変更後の値が格納されている。

struct App {
    var contacts = [String]() {
        willSet {
            print("Current value is: \(contacts)")
            print("New value will be: \(newValue)")
        }
        
        didSet {
            print("There are now \(contacts.count) contacts.")
            print("Old value was \(oldValue)")
        }
    }
}

var app = App()
app.contacts.append("Adrian E")
app.contacts.append("Allen W")
app.contacts.append("Ish S")
// 配列にデータを追加した流れが出力される。

イニシャライザ

一般的な言語と同じ書き方。

struct Player {
    let name: String
    let number: Int
    
    init(name: String) {
        self.name = name
        number = Int.random(in: 1...99)
    }
}

let player = Player(name: "Megan R")
print(player)  // 出力: Player(name: "Megan R", number: 63)

Discussion