import Swift



struct Student {

    // 인스턴스 저장 프로퍼티

    var name: String = ""

    var `class`: String = "Swift"

    var koreanAge: Int = 0

    

    // 인스턴스 연산 프로퍼티

    var westernAge: Int {

        get {

            return koreanAge - 1

        }

        set(inputValue){

            koreanAge = inputValue + 1

        }

    }

    

    // 타입 저장 프로퍼티

    static var typeDescription: String = "학생"

    

    // 읽기전용 인스턴스 연산 프로퍼티

    var selfIntroduction: String {

        get {

            return "저는 \(self.class)반 \(name)입니다"

        }

    }

    // 읽기전용 타입 연산 프로퍼티

    // 읽기전용에서는 get을 생략할 수 있습니다.

    static var selfIntroduction: String {

        return  "학생타입입니다"

    }

}

// 타입 연산 프로퍼티 사용

print(Student.selfIntroduction)


// 인스턴스 생성

var senior: Student = Student()

senior.koreanAge = 10


// 인스턴스 저장 프로퍼티 사용

senior.name = "성인"

print(senior.name)


// 인스턴스 연산 프로퍼티 사용

print(senior.selfIntroduction)


print("제 한국나이는 \(senior.koreanAge)살이고, 미국나이는 \(senior.westernAge)살입니다.")


struct Money {

    var currencyRate: Double = 1100

    var dollar: Double = 0

    var won: Double {

        get {

            return dollar * currencyRate

        }

        set {

            dollar = newValue / currencyRate

        }

    }

}


var moneyInMyPocket = Money()


moneyInMyPocket.won = 11000


print(moneyInMyPocket.won)


moneyInMyPocket.dollar = 10


print(moneyInMyPocket.won)  // 11000


var a: Int = 100

var b: Int = 200

var sum: Int {

    return a + b

}


print(sum) // 300


// 프로퍼티 감시자


struct Money2 {

    // 프로퍼티 감시자 사용

    var currencyRate: Double = 1100 {

        willSet(newRate){

            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다.")

        }

        

        didSet(oldRate){

            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다.")

        }

    }

    // 프로퍼티 감시자 사용

    var dollar: Double = 0 {

        // willSet의 암시적 매개변수 이름 newValue

        willSet {

            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")

        }

        

        // didSet의 암시적 매개변수 이름 oldValue

        didSet {

            print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")

        }

    }

    

    // 연산 프로퍼티

    var won: Double {

        get {

            return dollar * currencyRate

        }

        set {

            dollar = newValue / currencyRate

        }

    }

    

}


var moneyInMyPocket2: Money2 = Money2()


moneyInMyPocket2.currencyRate = 1150


moneyInMyPocket2.dollar = 10


print(moneyInMyPocket2.won)


/*

 프로퍼티 감시자의 기능은

 함수, 메서드, 클로저, 타입 등의 외부에 위치한

 지역/전역 변수에도 모두 사용 가능합니다.

 */


var c: Int = 100 {

    willSet {

        print("\(c)에서 \(newValue)로 변경될 예정입니다.")

    }

    didSet {

        print("\(oldValue)에서 \(c)로 변경되었습니다")

    }

}


c = 200



+ Recent posts