본문 바로가기
IT/swift

100 days of SwiftUI - Day10 ~ Day11

by 가능성1g 2024. 11. 13.
반응형

swift 에서는 class 보다 struct 를 많이 쓴다고 합니다. 

java에서는 wrapping class 라고 하는 원시타입(int, float, double 등등등) 의 클래스들도 struct 로 구현되었다고 하네요! 오호!

 

c의 struct 같은 경우에는 별도 함수정의가 없는데 swift 에서는 함수정의가 되고, 

대신 struct 내의 변수 조작을 하려면 함수 앞에 mutating 을 써야 합니다. 

또, 해당 구조체를 이용한 변수 선언시에 상수(let)로 선언하면 오류가 발생합니다. 

 

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.")
        }
    }
}

var archer1 = Employee(name: "Sterling Archer", vacationRemaining: 14)
//사실 초기화 함수인 init 이 숨어이따!!
var archer2 = Employee.init(name: "Sterling Archer", vacationRemaining: 14)
//이렇게 선언하면
let poovey = Employee(name: "Pam Poovey", vacationRemaining: 35)
//이 호출은 안될쎼..
poovey.takeVacation(days: 10)

 

struct Employee {
    let name: String
    var vacationAllocated = 14
    var vacationTaken = 0

    var vacationRemaining: Int {
        get {
            vacationAllocated - vacationTaken
        }

        set {
            vacationAllocated = vacationTaken + newValue
        }
    }
}

구조체 내의 할당 함수에 c#에서 많이 보던 get/set  사용가능! set 함수내에서 newValue 는 할당된 수를 나타냄.. 근데 이런건 그냥 언어적인 차원에서 이름을 정해준건가...

 

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")

신기한 예약어인 willSet 과 didSet 말그대로 변수에 값이 할당되기 직전과 직후에 실행되는 함수 여기에서도 예약어인 newValue, oldValue를 쓸 수 있다. 

 

struct 변수에 private 선언가능. static 사용 가능 ( 이럼 완전 class 잔앙.. )

 

struct Employee {
    let username: String
    let password: String

    static let example = Employee(username: "cfederighi", password: "hairforceone")
}

print(Employee.example)

var Han =  Employee(username: "HanTJ", password: "veryimportant")
print(Han)
//print(Han.example) //이건 안됨

 

"""
To check your knowledge, here’s a small task for you: create a struct to store information about a car, including its model, number of seats, and current gear, then add a method to change gears up or down. Have a think about variables and access control: what data should be a variable rather than a constant, and what data should be exposed publicly? Should the gear-changing method validate its input somehow?
"""
struct Car {
    let model:String
    let seatsNumber:Int
    
    init(model:String, seatsNumber: Int) {
        self.model = model
        self.seatsNumber = seatsNumber
        self.currentGear = 0
    }
    
    private var currentGear:Int {
        willSet {
                print("기어가 변경됩니다. \(currentGear) -> \(newValue)")
        }
        didSet {
            if oldValue == currentGear {
                print("기어 유지! \(currentGear)")
            }
        }
    }
    
    mutating func changeGear(direction: String) {
        if direction == "UP" {
            self.currentGear += 1
        } else if direction == "DOWN" {
            self.currentGear -= 1
        }
        
        if self.currentGear < 0 {
            self.currentGear = 0
        } else if self.currentGear > 5 {
            self.currentGear = 5
        }
        
    }
}

var sonata = Car(model: "SonataDN8", seatsNumber: 4)
sonata.changeGear(direction: "UP")
sonata.changeGear(direction: "UP")
sonata.changeGear(direction: "DOWN")
sonata.changeGear(direction: "DOWN")
sonata.changeGear(direction: "DOWN")

의도 되지 않은 오류가 발생했음..  수정하진 않고 그대로 두겠음!

반응형