[Swift] 프로퍼티

ds-k.mo·2022년 4월 29일
0

Swift

목록 보기
9/22

프로퍼티

클래스, 구조체 또는 열거형 등에 관련된 값 -> 인스턴스의 값

저장 프로퍼티 (클래스, 구조체)

클래스나 구조체에 저장된 값

/ in struct...
struct Pig {
    var name: String
    let gender:String
}

var pig = Pig(name: "꿀꿀이", gender: "수컷")

pig.name = "멧돼지"
// pig.gender = "암컷" // Error : gender가 상수로 선언

// 인스턴스 자체를 상수로 선언했을 때,
let pig2 = Pig(name: "왕돼지", gender: "수컷")
//pig.name = "작은돼지" // Error : 프로퍼티도 모두 상수로 되어서 에러 발생, 구조체는 value 타입이기 때문!

// in Class

class Cow {
    var name:String
    let gender:String
    
    init(name:String, gender: String) {
        self.name = name
        self.gender = gender
    }
}

let cow = Cow(name: "물소", gender : "수컷")
cow.name = "황소"
print(cow.name) // "황소" 에러가 나지 않는 이유 : Class는 참조 타입라서 가능하다.

연산 프로퍼티 (클래스, 구조체, 열거형)

값을 직접적으로 저장하는 대신에, getter와 setter를 사용해서 다른 프로퍼티에 접근 가능

struct Stock {
    var averagePrice: Int
    var quantity: Int
    var purchasePrice : Int {
        get {
            return averagePrice * quantity
        }
        
        set(newPrice) {
            averagePrice = newPrice / quantity
        }
    }
}

var stock = Stock(averagePrice: 2300, quantity : 3)

stock.purchasePrice // 6900, 연산 프로퍼티에 접근하면 get 블록 안의 코드가 실행된다.
stock.purchasePrice = 3000
stock.averagePrice // 1000, 연산 프로퍼티의 값이 바뀌면 set 블록 안의 코드가 실행된다.

프로퍼티 옵저버

class Account {
    var credit : Int = 0 {
    // 소괄호로 이름 지정 가능 (default : newValue / oldValue)
        willSet {
            print("변경 예정 : \(newValue)")
        }
        didSet {
            print("변경 전 : \(oldValue)")
        }
    }
}

// willSet - 값이 저장되기 직전에 불리는 옵저버
// didSet - 값이 저장된 직후에 불리는 옵저버

var account = Account()
account.credit = 1000 // 변경 예정 : 1000 , 변경 전 : 0

타입 프로퍼티

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty : Int {
        return 1
    }
}

SomeStructure.computedTypeProperty // 1
SomeStructure.storedTypeProperty // Some value.
SomeStructure.storedTypeProperty = "Daeseong"
SomeStructure.storedTypeProperty // Daeseong

변수에 클래스나 구조체를 할당해 인스턴스 없이도 값에 접근이 가능하다.

0개의 댓글