Programming/Swift(iOS)
Swift Property - 1
홍열
2021. 4. 1. 22:57
728x90
프로퍼티는 접근자의 메소드를 자동으로 생성하는 기술이라고 볼 수 있습니다.
예를 들면, positionX의 값을 구하는데 있어서 x의 좌표가 필요하다고 합니다.
그렇다면 아래와 같이 get블럭 안에서 계산된 값을 전달 받을 수 있습니다.
이를 계산 프로퍼티 혹은 연산 프로퍼티라고 합니다.
let x:Int = 10
let positonX:Int {
get {
return x + 10
}
}
단순히 var로 된 변수를 선언하는 것은 저장 프로퍼티라고 합니다.
swift에서는 상수, 변수냐에 따라서 get, set을 사용하는 범위가 달라집니다.
let -> get
var -> get, set
let은 한번 정해지면 변할 수 없는 값이기 때문에 set을 할 수가 없습니다.
또하느 계산프로퍼티는 어떻게 보면 프로퍼티를 가장한 메소드입니다. 다른 값까지 가져와서 계산할 수 있기 때문입니다.
예를 보시죠
struct Timer {
let id:Int
let startTime:Date
var endTime:Date?
func elapsedTime() -> TimeInterval {
return Date().timeIntervalSince(startTime)
}
func isFinished() -> Bool {
return endTime != nil
}
// struct 내부 멤버를 변환시에는 mutating keyword 사용
mutating func setFinished() {
endTime = Date()
}
// 원래 구조체 멈버는 자동으로 초기화 됩니다.
// 사용자가 원하는 형태로 초기화 하고 싶으면 아래와 같이 초기화 메서드를 구현해주면 됩니다.
// 단, 초기화 메서드를 구현하는 순간, 자동으로 제공되는 초기화 메서드는 더 이상 사용할 수 없습니다.
init(id:Int, startTime:Date) {
self.id = id
self.startTime = startTime
}
}
var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime())
sleep(2)
print(timer.elapsedTime())
timer.setFinished()
print(timer.elapsedTime())
struct 안에 함수를 만들고, 사용하고 있습니다. mutating을 사용해서 struct 내부 변수가 변경되는것도 알 수 있습니다.
이걸 저장, 계산 프로퍼티로 바꿔보겠습니다.
기존의 함수 부분들을 연산 프로퍼티로 변경해봤습니다.
struct Timer {
let id:Int
let startTime:Date
var endTime:Date?
var elapsedTime:TimeInterval {
get {
return Date().timeIntervalSince(startTime)
}
}
var isFinished:Bool {
get {
return endTime != nil
}
set {
if newValue {
endTime = Date()
} else {
endTime = nil
}
}
}
}
var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime)
sleep(2)
print(timer.elapsedTime)
timer.isFinished = true //구조체의 경우 var로 되어 있어야한다.
print(timer.isFinished)
이와 같이 변경했을 때, 함수를 따로 구현해도 되지 않기때문에 가독성이 훨씬 좋아보입니다.