ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift Property - 1
    Programming/Swift(iOS) 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)
    

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

    '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
Designed by Tistory.