반응형
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")
의도 되지 않은 오류가 발생했음.. 수정하진 않고 그대로 두겠음!
반응형