Basic - Properties

Eli·2021년 2월 6일
1

Swift

목록 보기
4/17
post-thumbnail

Stored Properties

단순히 Class, Struct, Value 등을 저장할 수 있는 기능
가장 일반적인 기능

//기본 var, let
struct FixedLengthRange {
		//수정 가능
    var firstValue: Int

		// 수정 불가능 
    let length: Int
}

var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
rangeOfThreeItems.firstValue = 6

lazy

lazy로 선언을 하게되면 호출 전까지는 생성을 하지 않는다.
상황에 따라서 조건부로 사용되거나 꼭 init 시점에 호출이 필요가 없다면,
적당히 사용한다면 불필요한 리소스를 사용을 줄일 수 있다.

생각보다 lazy로 선언이 될 수 있는 내용들이 꽤 많다.
그리고 init시점에 다른 Property를 필요로 한다면 lazy를 쓸 수도 있다.

let initValue = Value()
lazy var lazyValue = Value()

//아래와같이 호출이 이루어질때 생성이 된다.
print(lazyValue)

Computed Properties

Stored Properties는 단순 저장을 목적으로 했다면 이 녀석은 특정 상태에 따른 연산을 목적으로 하는 Property

코드로 보자

//단순한 예시
struct CompactRect {
    private var _ origin = Point()
    var size = Size()
    var center: Point {
        get {
						//한줄 표현일 경우 return 생략 가능
            Point(x: origin.x + (size.width / 2),
                  y: origin.y + (size.height / 2))
        }
				
				//새로 들어오는 값은 newValue로 들어와 생략이 가능
        set(newValue) {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

//읽기 전용
//get만 정의하게되면 자동으로 읽기전용이 된다.
//그럴경우 get도 생략가능
struct CoordinatePoint {
    var x: Int
    var y: Int
    
    var oppositePoint: CoordinatePoint {
        get{
            return CoordinatePoint(x: 10, y: 20)
        }
    }

    //또는 get을 생략하여 바로 사용할 수 있다.
    var oppositePoint: CoordinatePoint {
        return CoordinatePoint(x: 10, y: 20)
    }
}

아니 잠깐만 저거 근데 왜 필요해?
함수를 구현해서도 사용가능한거잖아?

라고 생각을 했었습니다.

공식 문서에는 그에 대한 언급은 없었습니다.
근데 좀 찾아보니까 get set으로 함수 두개 만들래?
아 ㅇㅋ.. 납득해버렸습니다.

특정 값을 가져오는 과정에서 편하게 사용하실 수 있습니다.

Property Observers

특정 property에 값이 변경될 예정이거나 변경되었을 때 호출되어 시점에 따라 액션을 취할 수 있는 기능.
크게 어려운 내용은 아니라서 코드로 마무리 한다.

var credit: Int = 0 {
	//값이 변경되기 전
	//set 처럼 newValue 수정 또는 생략가능
    willSet(newValue) {
    	print("잔액이 \(credit)에서 \(newValue)원으로 변경될 예정입니다.")
     }

	//값이 변경된 후
	//set 처럼 oldValue 수정 또는 생략가능
    didSet(oldValue) {
       print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")

		//아래처럼 값이 저장이 됐을때 ui를 업데이트하는 등 상황에서 유용
		uiUpdate()
     }
}

Property Wrappers

Swift 5.1 에서 새로 추가된 기능

get/set에 들어가는 내용들이 반복적인 코드를 활용하는 상황에서 유용하게 사용될 수 있다.

미리 get/set 시점의 구현되는 로직들을 별도의 struct, enum, class 등으로 구현을 해 property선언 시점에 명시하는 방식으로 간단하게 구현 할 수 있다.

사용방법은 아래와 같다.

새롭게 swift에 반영된 기능으로 실제 사용사례나 적합한 사용시점은 조금 더 공부를 해봐야 알 것 같다. (나중에 보니까 Swift UI에서 사용되는 것 같다. Swift UI 학습시에 함께 보아야겠다)

//property wrapper를 사용하기 위해서는 꼭 아래와 같이 number와 wrappedValue 를 구현
//projectedValue는 선택적으로 더 많은 정보를 제공하기 위해 사용되는 값

@propertyWrapper
struct SmallNumber {
		//실제 사용되는 값
    private var number = 0
		
		//해당 property에서 값의 조정여부를 알기 위한 목적으로 반영됨
    var projectedValue = false
		
		//아래 wrappedValue의 get/set을 구현		
    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }
}

//property wrapper를 사용하는 방법
struct SomeStructure {
    @SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()

//$를 통해 projectedValue에 접근할 수 있음
// 12보다 작으므로 조정이 필요없어 projectedValue는 false
someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"

//12 보다 큰 수가 할당되어 set과정에서 projectedValue가 true가 됨
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"

#학습에 대한 내용으로 틀린 내용이 있을 수 있습니다.
#댓글로 남겨주시면 더 좋은 게시글로 수정하도록 하겠습니다.

profile
애플을 좋아한다. 그래서 iOS 개발을 한다. @Kurly

0개의 댓글