-
Swift Property - 1Programming/Swift(iOS) 2021. 4. 1. 22:57728x90
프로퍼티는 접근자의 메소드를 자동으로 생성하는 기술이라고 볼 수 있습니다.
예를 들면, 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)
이와 같이 변경했을 때, 함수를 따로 구현해도 되지 않기때문에 가독성이 훨씬 좋아보입니다.
'Programming > Swift(iOS)' 카테고리의 다른 글
Swift Property - 3 (0) 2021.04.01 Swift Property - 2 (0) 2021.04.01 Swift Enum - 4 (0) 2021.04.01 Swift Enum - 3 (0) 2021.04.01 Swift Enum - 2 (0) 2021.04.01