[Swift] 프로퍼티(Property)

개자이너·2022년 2월 6일
0

내맘대로 Swift

목록 보기
6/6

프로퍼티

접근자 메소드를 자동으로 생성하는 기술입니다.

let으로 생성했을 경우에는 getter 기능만 제공하는 것이고,
var로 생성했을 경우에는 getter, (optional) setter 두 가지 기능을 모두 제공하는 것입니다.

  • Stored Property - 저장형 프로퍼티
    • 단순히 값을 저장하고 있는 프로퍼티
    • Enum 에서 사용 불가능
  • Computed Property - 계산형 프로퍼티
    • var를 사용합니다.
    • newValuesetter에서 새로운 값을 사용할 수 있습니다. (변수명 지정도 가능합니다)
    • 프로퍼티를 가장한 메소드입니다
    • 간단한 메소드를 계산형 프로퍼티로 사용하면, 코드의 가독성에 도움이 됩니다.

메소드로 기능을 제공할 경우

struct Timer {
	let id: Int
    let startTime: Date
    var endTime: Date?
    
    func elapsedTime() -> TimeInterval {
    	return Date().timeIntervalSince(startTime)
    }
    
    func isFinished() -> Bool {
    	return endTime != nil
    }
    
    // mutating이 없으면 오류 발생!!
    // mutating 문구를 func 앞에 추가 해주어야 합니다.
    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.isFinished())

mutating

내부의 속성을 변경하는 메소드는 반드시 mutating 으로 지정되어야 합니다.

  1. 가변객체

var timer = Timer()가변 객체이기 때문에, mutating method를 호출할 수 있습니다.

  1. 불변객체

let timer = Timer()불변 객체이기 때문에, 내부의 속성을 변겨할 수 없습니다. 즉, mutating method를 호출할 수 없습니다.


Computed Property로 기능을 제공할 경우

struct Timer {
	let id: Int
    let startTime: Date
    var endTime: Date?
    
    // Computed Property는 var를 사용해야 합니다.
    // Getter만 제공할 경우에는 get을 생략해도 됩니다.
    var elapsedTime: TimeInterval {
    	get {
        	return Date().timeIntervalSince(startTime)
        }
    }
    
    var isFinished: Bool {
    	get {
        	return endTime != nil
        }
        
        set {
        	// newValue: 사용자가 전달한 값
            if newValue {
            	endTime = Date()
            } else {
            	endTiem = nil
            }
        }
    }
    
    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.isFinished = true // 구조체의 경우에는 var에서만 수행 가능
print(tiemr.isFinished)
profile
개발과 디자인을 다 하려는 욕심 그득한 노예

0개의 댓글