10-11일 차: SwiftUI의 100일

구조체, 계산된 속성 및 속성 관찰자



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

구조체



클래스 및 열거형과 마찬가지로 구조체는 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.")
        }
    }
}


계산된 속성



구조체는 두 종류의 속성을 가질 수 있습니다. 저장된 속성은 구조체의 인스턴스 내부에 데이터 조각을 보유하는 변수 또는 상수이고 계산된 속성은 액세스할 때마다 동적으로 속성 값을 계산합니다.

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로 표시된 Getter는 데이터를 읽고 계산하는 반면, set로 표시된 Setter는 사용자가 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

액세스 제어



액세스 제어는 구조체 외부에서 구조체의 속성 및 메서드에 액세스할 수 있는 방법을 제어합니다.

Swift는 여러 수준의 액세스 제어를 제공합니다.
  • public 액세스 - 구조체 외부에서 사용할 수 없습니다
  • .
  • fileprivate 액세스 - 현재 파일 외부에서 사용할 수 없음
  • private 액세스 - 어디서나 사용 가능
  • private(set) 액세스 - 어디에서나 읽을 수 있지만 구조체의 메서드만 쓸 수 있습니다.

  • 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



    모델, 좌석 수, 현재 기어를 포함하여 자동차에 대한 정보를 저장하는 구조체를 만든 다음 기어를 위 또는 아래로 변경하는 메서드를 추가합니다. 변수 및 액세스 제어에 대해 생각해 보십시오. 상수가 아닌 변수여야 하는 데이터는 무엇이며 공개적으로 노출되어야 하는 데이터는 무엇입니까? 기어 변경 방법이 어떻게든 입력을 검증해야 합니까?

    해결책

    좋은 웹페이지 즐겨찾기