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)

이와 같이 변경했을 때, 함수를 따로 구현해도 되지 않기때문에 가독성이 훨씬 좋아보입니다.