日10 - 11 : Swiftuiの100日


構造、計算されたプロパティ、およびプロパティオブザーバ


https://www.hackingwithswift.com/100/swiftui/10

構造


クラスとenumsのように、Structsは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)

print(red.title)

red.printSummary()

突然変異機能


関数が構造体のデータを変更したい場合は、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 remaining.")
        }
    }
}

計算のプロパティ


構造体は2種類のプロパティを持つことができます.ストアドプロパティは、構造体のインスタンス内のデータを保持する変数または定数であり、計算されたプロパティは、アクセスされるたびに動的にプロパティの値を計算します.
struct Employee {
    let name: String
    var vacationAllocated = 14
    var vacationTaken = 0

    var vacationRemaining: Int {
        get {
        vacationAllocated - vacationTaken
        }

        set {
            vacationAllocated = vacationTaken + newValue
        }
    }
}

var archer = Employee(name: "Sterling Archer", vacationAllocated: 14)
archer.vacationTaken += 4
archer.vacationRemaining = 5
print(archer.vacationAllocated)
ゲッターget データを読み込み、計算するset ユーザーがプロパティに割り当てるしようとした値に基づいて直接データを書き込み/更新するnewValue .

プロパティオブザーバ


プロパティオブザーバは、プロパティが変更されたときに実行されるコードのブロックです.エーdidSet プロパティが変更されたときにwillSet プロパティが変更される前にオブザーバを実行します.
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")

カスタム初期化


カスタム初期化子を作成するには、init 関数なしfunc キーワード
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.number)

アクセス制御、静的プロパティおよびメソッド、およびチェックポイント6


https://www.hackingwithswift.com/100/swiftui/11

アクセス制御


アクセス制御はstructのプロパティとメソッドを構造体の外部からどのようにアクセスできるかを制御します.
Swiftアクセス制御のいくつかのレベルを提供しています.
  • public アクセスは構造体外では使えません
  • fileprivate 現在のファイルの外ではアクセスできません
  • private アクセス可能
  • private(set) アクセス-どこでも読むことができますが、structのメソッドだけがそれに書き込むことができます.
  • struct BankAccount {
        private var funds = 0
    
        mutating func deposit(amount: Int) {
            funds += amount
        }
    
        mutating func withdraw(amount: Int) -> Bool {
            if funds > amount {
                funds -= amount
                return true
            } else {
                return false
            }
        }
    }
    

    静的特性と方法


    プロパティまたはメソッドを直接使用する場合、すなわち、さまざまな場所でアクセスする必要のある固定データを格納する場合は、使用しますstatic プロパティとメソッドについて
    struct AppData {
        static let version = "1.3 beta 2"
        static let saveFilename = "settings.json"
        static let homeURL = "https://www.hackingwithswift.com"
    }
    
    print(AppData.version)
    

    チェックポイント6


    そのモデル、座席数、および現在のギアを含む車についての情報を格納する構造を作成し、ギアを上下に変更する方法を追加します.変数とアクセス制御について考えてください:データは定数よりむしろ変数であるべきです、そして、どんなデータを公的に公開されるべきですか?歯車の変更方法は入力を何らかの方法で検証するか?

    ソリューション