Skip to content

Latest commit

Β 

History

History
335 lines (249 loc) Β· 13 KB

Property.md

File metadata and controls

335 lines (249 loc) Β· 13 KB

ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€

μ°Έκ³ ν•œ 쒋은 κΈ€

Answer

Property(ν”„λ‘œνΌν‹°): "μž¬μ‚°", "μ†Œμœ λ¬Ό", "속성"

ν”„λ‘œνΌν‹°λŠ” ν΄λž˜μŠ€λ‚˜ ꡬ쑰체, ν˜Ήμ€ μ—΄κ±°ν˜•μ˜ 객체 μΈμŠ€ν„΄μŠ€κ°€ κ·Έ 내뢀에 가지고 μžˆλŠ”, 객체의 μƒνƒœμ— κ΄€ν•œ 정보이닀.

μ΄λŸ¬ν•œ ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜μ—λŠ” 크게 5가지가 μžˆλ‹€.

  1. Stored Property(μ €μž₯ ν”„λ‘œνΌν‹°)
  2. Lazy Stored Property(지연 μ €μž₯ ν”„λ‘œνΌν‹°)
  3. Compute Property(μ—°μ‚° ν”„λ‘œνΌν‹°)
  4. Property Observer(ν”„λ‘œνΌν‹° μ˜΅μ €λ²„)
  5. Type Property(νƒ€μž… ν”„λ‘œνΌν‹°)

Stored Property

κ°€μž₯ λ‹¨μˆœν•œ κ°œλ…μ˜ ν”„λ‘œνΌν‹°λ‘œμ¨ 클래슀 λ˜λŠ” ꡬ쑰체의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λœ 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°.

κ΅¬μ‘°μ²΄λŠ” μ €μž₯ ν”„λ‘œνΌν‹°μ˜ μ˜΅μ…”λ„ 여뢀와 상관없이 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μžλ™μœΌλ‘œ 생성됨

클래슀의 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„μ΄ μ•„λ‹Œ 이상, ν”„λ‘œνΌν‹° κΈ°λ³Έ 값을 μ§€μ •ν•΄μ£Όκ±°λ‚˜ μ‚¬μš©μžμ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™” ν•΄μ£Όμ–΄μ•Ό 함

  • Struct(ꡬ쑰체)

    struct MyPoint {
    var x: Int  // μ €μž₯ ν”„λ‘œνΌν‹°
    var y: Int  // μ €μž₯ ν”„λ‘œνΌν‹°
    }
    
    //κ΅¬μ‘°μ²΄λŠ” 기본적으둜 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°€μ§€λŠ” μ΄λ‹ˆμ…œλΌμ΄μ Έκ°€ μžˆλ‹€.
    let point: MyPoint = MyPoint(x: 10, y: 5)

    μ€‘μš”ν•œ 것은 ꡬ쑰체의 λ‚΄λΆ€ λ³€μˆ˜κ°€ MyPoint처럼 μ „λΆ€ let으둜 μ„ μ–Έλœκ²Œ μ•„λ‹ˆλ”λΌλ„ μΈμŠ€ν„΄μŠ€λ₯Ό let으둜 μ„ μ–Έν•˜κ²Œ 되면 Value Type인 ꡬ쑰체의 νŠΉμ„±μƒ λ‚΄λΆ€ μ €μž₯ ν”„λ‘œνΌν‹°λ“€λ„ let으둜 μ„ μ–Έ 된 것 같이 λœλ‹€.

    let point: MyPoint = MyPoint(x: 10, y: 5)
    
    point.x = 0 // error: cannot assign to property: 'x' is a 'let' constant
    point.y = 0 // error: cannot assign to property: 'x' is a 'let' constant
  • Class(클래슀)

    class Position {
    var point: MyPoint  // μ €μž₯ ν”„λ‘œνΌν‹°(λ³€μˆ˜)
    let name: String    // μ €μž₯ ν”„λ‘œνΌν‹°(μƒμˆ˜)
    
    // μ €μž₯ ν”„λ‘œνΌν‹°λ“€μ—κ²Œ μ΄ˆκΈ°κ°’μ΄ μ—†λ‹€λ©΄, ν΄λž˜μŠ€λŠ” init이 λ°˜λ“œμ‹œ ν•„μš”ν•˜λ‹€.
    init(name: String, currentPoint: MyPoint) {
            self.name = name
            self.point = currentPoint
        }
    }
    
    //ν΄λž˜μŠ€λŠ” μ‚¬μš©μžμ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό ν˜ΈμΆœν•΄μ•Όλ§Œ ν•œλ‹€.
    //그렇지 μ•ŠμœΌλ©΄ ν”„λ‘œνΌν‹° μ΄ˆκΉƒκ°’μ„ ν• λ‹Ήν•  수 μ—†κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€λŠ₯ ν•˜λ‹€.
    let position: Position = Position(name: "동글이", currentPoint: point)

    ν΄λž˜μŠ€λŠ” ꡬ쑰체와 λ‹€λ₯΄κ²Œ Reference Typeμ΄λ―€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό let으둜 μ„ μ–Έν•˜μ—¬λ„ 원본 값에 μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— var둜 μ„ μ–Έλœ μ €μž₯ ν”„λ‘œνΌν‹°κ°€ var의 νŠΉμ„±μ„ μœ μ§€ν•œλ‹€.

    let position: Position = Position(name: "동글이", currentPoint: point)
    
    position.point = MyPoint(x: 0, y: 0)
    position.name = "λ³€κ²½ν• λž˜" // error: cannot assign to property: 'name' is a 'let' constant

Lazy Stored Property

Lazy Stored Property(지연 μ €μž₯ ν”„λ‘œνΌν‹°)λŠ” μ΄ˆκΈ°ν™” μ‹œμ μ— μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•΄λ‹Ή ν”„λ‘œνΌν‹°κ°€ 처음 μ‚¬μš© λ˜λŠ” μ‹œμ μœΌλ‘œ μ΄ˆκΈ°ν™”λ₯Ό λ―Έλ£¨λŠ” ν”„λ‘œνΌν‹°μ΄λ‹€.

ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ”λ° λ§Žμ€ μ—°μ‚° ν˜Ήμ€ λ©”λͺ¨λ¦¬λ₯Ό ν•„μš”λ‘œ ν•˜κ±°λ‚˜, λ„€νŠΈμ›Œν¬ 접속과 같이 μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” μž‘μ—…μ„ 포함해야 ν•œλ‹€λ©΄ ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ˜ μ‚¬μš© μ—¬λΆ€κ°€ λΆˆν™•μ‹€ν•œ μƒν™©μ—μ„œ 무쑰건 ν•¨κ»˜ μ΄ˆκΈ°ν™”ν•˜λŠ” 것은 쒋지 μ•Šμ€ μ „λž΅μ΄λ‹€.

보톡 λ³΅μž‘ν•œ ν΄λž˜μŠ€λ‚˜ ꡬ쑰체λ₯Ό κ΅¬ν˜„ν•  λ•Œ 많이 μ‚¬μš©λ˜κ³€ ν•œλ‹€.

struct MyPoint {
  var x: Int = 0
  var y: Int = 0
}

class Position {
  lazy var point: MyPoint = MyPoint()
  let name: String

  init(name: String) {
      self.name = name
  }
}
//Positionμ΄λΌλŠ” 객체λ₯Ό μƒμ„±λ¬μ§€λ§Œ 아직 MyPoint 객체에 μƒμ„±λ˜μ§€ μ•Šμ€ μƒνƒœ.
let position: Position = Position(name: "동글이")

//이 μ½”λ“œλ₯Ό 톡해 pointν”„λ‘œνΌν‹°λ‘œ 처음 μ ‘κ·Όν•  λ•Œ point ν”„λ‘œνΌν‹°μ˜ CoordinatePointκ°€ μƒμ„±λ©λ‹ˆλ‹€.
print(position.point)

μ΄λŸ¬ν•œ νŠΉμ„±μ„ μ΄μš©ν•˜μ—¬ λΆˆν•„μš”ν•œ 곡간 λ‚­λΉ„ 와 μ„±λŠ₯ μ €ν•˜λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.


Compute Property

νŠΉμ„± μƒνƒœμ— λ”°λ₯Έ 값을 μ—°μ‚°ν•˜λŠ” ν”„λ‘œνΌν‹°. μΈμŠ€ν„΄μŠ€μ˜ λ‚΄/μ™ΈλΆ€μ˜ 값을 μ—°μ‚°ν•˜μ—¬ μ μ ˆν•œ 값을 returnν•˜λŠ” getter의 μ—­ν• μ΄λ‚˜ 은닉화(private)된 λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹° 값을 κ°„μ ‘μ μœΌλ‘œ μ„€μ •ν•˜λŠ” setter의 역할을 μˆ˜ν–‰ν•  μˆ˜λ„ μžˆλ‹€.

ꡳ이 λ©”μ„œλ“œκ°€ μ•„λ‹Œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ©”μ„œλ“œλ‘œ κ΅¬ν˜„μ‹œ getter 와 stter의� 역할을 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ”°λ‘œ λ”°λ‘œ κ΅¬ν˜„ν•΄μ£Όμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

setter만 κ΅¬ν˜„ν•˜λŠ” 것은 λΆˆκ°€ν•˜λ‹ˆ μ£Όμ˜ν•  것

  • λ©”μ„œλ“œ μ‚¬μš©

    struct MyPoint {
        var x: Int
        var y: Int
        
        // λŒ€μΉ­μ μ„ κ΅¬ν•˜λŠ” λ©”μ„œλ“œ - μ ‘κ·Όμž(getter)
        func oppsitePoint() -> MyPoint {
            return MyPoint(x: -x, y: -y)
        }
        // setter
        mutating func setOppositePoint(_ opposite: MyPoint) {
            x = -opposite.x
            y = -opposite.y
        }
    }
    
    var position: MyPoint = MyPoint(x: 10, y: 20)
    
    // ν˜„μž¬ μ’Œν‘œ 10, 15
    print(position)
    
    // λŒ€μΉ­ μ’Œν‘œ -10, -15
    print(position.oppsitePoint())
    
    // μ’Œν‘œλ₯Ό (-15, -10)으둜 μ„€μ •ν• λž˜
    position.setOppositePoint(MyPoint(x: 15, y: 10))
    
    print(position) // -15, -10
  • μ—°μ‚° ν”„λ‘œνΌν‹° μ‚¬μš©

    struct MyPoint {
        var x: Int // μ €μž₯ ν”„λ‘œνΌν‹°
        var y: Int // μ €μž₯ ν”„λ‘œνΌν‹°
        
        // μ—°μ‚° ν”„λ‘œνΌν‹°
        var oppsitionPoint: MyPoint {
            get {
                return MyPoint(x: x, y: y)
            }
            set (someParam) {
                x = -someParam.x
                y = -someParam.y
            }
        }
    }
    
    var position: MyPoint = MyPoint(x: 10, y: 20)
    print(position) // MyPoint(x: 10, y: 20)
    position.oppsitionPoint = MyPoint(x: 5, y: 10)
    print(position.oppsitionPoint) // MyPoint(x: -5, y: -10)
  • 정리

    1. 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— μ‚¬μš©λœλ‹€.

    2. var둜 μ„ μ–Έν•΄μ•Όν•œλ‹€.

    3. 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— 값을 μ €μž₯ν•  μ €μž₯ν”„λ‘œνΌν‹°κ°€ ν•˜λ‚˜ μžˆμ–΄μ•Όν•œλ‹€.==> μ—°μ‚°ν”„λ‘œνΌν‹° 자기 μžμ‹ μ„ λ¦¬ν„΄ν•˜κ±°λ‚˜ 값을 지정할 수 μ—†λ‹€.

    4. get, set을 λ™μ‹œμ— κ΅¬ν˜„ κ°€λŠ₯ν•˜λ©°, get만 κ΅¬ν˜„ν•˜λŠ” 것도 κ°€λŠ₯(이 λ•ŒλŠ” get ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯). ν•˜μ§€λ§Œ set만 κ΅¬ν˜„ν•˜λŠ” 것은 μ•ˆλœλ‹€!

    5. set의 νŒŒλΌλ―Έν„°λ₯Ό μƒλž΅ν•  수 있으며(μ½”λ“œμ—μ„œ someParam) μƒλž΅ν–ˆμ„ μ‹œ, newValueλΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.


Property Observer

μ˜΅μ €λ²„ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ 값이 변경됨에 따라 μ μ ˆν•œ μ•‘μ…˜μ„ μ·¨ν•  수 μžˆλ‹€. ν”„λ‘œνΌν‹°μ˜ 값이 μƒˆλ‘œ 할당될 λ•Œ λ§ˆλ‹€, ν˜Ήμ€ λ³€κ²½λ˜λŠ” 값이 ν˜„μž¬ κ°’κ³Ό 같더라도 ν˜ΈμΆœλœλ‹€.

였직 μ €μž₯ ν”„λ‘œνΌν‹°μ—λ§Œ μ μš©ν•  수 있으며, lazy ν”„λ‘œνΌν‹°μ—λŠ” 지정할 수 μ—†λ‹€.

  • 정리

    • willSet:
      • 호좜 μ‹œκΈ°: 값이 μ €μž₯되기 직전에 호좜
      • μ „λ‹¬λ˜λŠ” 전달 인자: ν”„λ‘œνΌν‹°κ°€ 변경될 κ°’
      • default λ§€κ°œλ³€μˆ˜: newValue
    • didSet
      • 호좜 μ‹œκΈ°: μƒˆλ‘œμš΄ 값이 μ €μž₯된 직후에 호좜
      • μ „λ‹¬λ˜λŠ” 전달 인자: ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜κΈ° μ „μ˜ κ°’
      • default λ§€κ°œλ³€μˆ˜: oldValue
  • 예제

    class StepCounter {
    
        //totalStepsλŠ” "μ €μž₯ ν”„λ‘œνΌν‹°"μž…λ‹ˆλ‹€!!
        var totalSteps: Int = 0 {
    
            // willSet μ „λ‹¬λ˜λŠ” 전달 인자: "ν”„λ‘œνΌν‹°κ°€ 변경될 κ°’"
            // newTotalSteps: 200 => 300
        willSet(newTotalSteps) {
    
                print("totalSteps을 \(newTotalSteps)둜 μ„€μ •ν•˜λ €κ³  ν•©λ‹ˆλ‹€")
            }
    
            // didSet의 μ „λ‹¬λ˜λŠ” 전달 인자: "ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜κΈ° μ „μ˜ κ°’"
            // oldTotalSteps: 0 => 200
            didSet(oldTotalSteps) {
    
                if totalSteps > oldTotalSteps  {
    
                    print("\(totalSteps - oldTotalSteps)걸음이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
                }
    
            }
        }
    }
    
    let stepcounter = StepCounter()
    stepcounter.totalSteps = 200
    stepcounter.totalSteps = 300
    
    /**
    totalSteps을 200둜 μ„€μ •ν•˜λ €κ³  ν•©λ‹ˆλ‹€
    200걸음이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    totalSteps을 300둜 μ„€μ •ν•˜λ €κ³  ν•©λ‹ˆλ‹€
    100걸음이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    */
  • μ§€μ—­λ³€μˆ˜μ™€ μ „μ—­λ³€μˆ˜
    ν”„λ‘œνΌν‹°λ₯Ό κ³„μ‚°ν•˜κ³  κ΄€μ°°ν•˜κΈ° μœ„ν•΄μ„œ μœ„μ—μ„œ μ„€λͺ…ν•œ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„ κΈ°λŠ₯은 μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

    • μ „μ—­λ³€μˆ˜: ν•¨μˆ˜, λ©”μ†Œλ“œ, ν΄λ‘œμ € λ˜λŠ” type context 외뢀에 μ •μ˜λ˜λŠ” λ³€μˆ˜
    • μ§€μ—­λ³€μˆ˜: ν•¨μˆ˜, λ©”μ†Œλ“œ λ˜λŠ” closure context λ‚΄μ—μ„œ μ •μ˜λ˜λŠ” λ³€μˆ˜
    • μ „μ—­μƒμˆ˜(global constant)와 μ „μ—­λ³€μˆ˜(global variable)은 항상 게으λ₯΄κ²Œ μ—°μ‚°λœλ‹€. == 즉, ν•„μš”ν•  λ•Œ μ΄ˆκΈ°ν™”.
    • μ „μ—­μƒμˆ˜(global constant)와 μ „μ—­λ³€μˆ˜(global variable)은 μ—°μ‚° ν”„λ‘œνΌν‹°μ™€λŠ” λ‹€λ₯΄κ²Œ lazyν‚€μ›Œλ“œκ°€ ν•„μš”μ—†λ‹€.
    • μ§€μ—­μƒμˆ˜(local constant)와 μ§€μ—­λ³€μˆ˜(local variable)은 게으λ₯΄κ²Œ μ—°μ‚°λ˜μ§€ μ•ŠλŠ”λ‹€.

Type Property

μ΄μ œκΉŒμ§€ μ•Œμ•„λ³Έ ν”„λ‘œνΌν‹° κ°œλ…μ€ λͺ¨λ‘ νƒ€μž…μ„ μ •μ˜ν•˜κ³  κ·Έ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„λ•Œ μ‚¬μš©λ  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° 이닀.

μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ 생성할 λ•Œ λ§ˆλ‹€ μ΄ˆκΉƒκ°’μ— ν•΄λ‹Ήν•˜λŠ” 값이 ν”„λ‘œνΌν‹°μ˜ 값이 되고, 각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€λ₯Έ 값을 지닐 수 있게 ν•΄μ€€λ‹€.

이와 λ‹€λ₯΄κ²Œ, 각각의 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•˜κ²Œ λ˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό νƒ€μž… ν”„λ‘œνΌν‹°λΌκ³  ν•œλ‹€.

  • 정리

    1. ν”„λ‘œνΌν‹°λ₯Ό "νƒ€μž… 자체"에 μ—°κ²°ν•  수 μžˆλŠ”λ°, 그게 νƒ€μž… ν”„λ‘œνΌν‹°μ΄λ‹€.

    2. νƒ€μž…ν”„λ‘œνΌν‹°μ—λŠ”, μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°μ™€ μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€.

    3. μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μƒμˆ˜/λ³€μˆ˜ 일 수 있으며((let / var둜 선언이 κ°€λŠ₯), 무쑰건 기본값을 μ€˜μ•Όν•œλ‹€. 그리고 처음 μ—‘μ„ΈμŠ€ ν•  λ•ŒλŠ” μ΄ˆκΈ°ν™”λ₯Ό 게으λ₯΄κ²Œν•œλ‹€! ν•˜μ§€λ§Œ lazyν‚€μ›Œλ“œλŠ” ν•„μš”μ—†λ‹€.

    4. μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°λŠ” 무쑰건 λ³€μˆ˜(var)둜 μ„ μ–Έλ˜μ–΄μ•Όν•œλ‹€.

    5. 클래슀 νƒ€μž…μ— λŒ€ν•œ μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°(Computed type property)의 경우, "class" ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΈŒν΄λž˜μŠ€κ°€ 슈퍼클래슀의 κ΅¬ν˜„μ„ μž¬μ •μ˜(override)ν•  수 μžˆλ‹€.

  • 예제 1

    class Aclass {
        // μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹° => 무쑰건 μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£Όμ–΄μ•Ό 함
        static var typeProperty: Int = 0
        
        // μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° => 무쑰건 var둜만 μ„ μ–Έλ˜μ–΄μ•Ό 함
        static var typeComputedProperty: Int {
            get {
                return typeProperty
            }
            
            set {
                typeProperty = newValue
            }
        }
    }
    
    // μΈμŠ€ν„΄μŠ€ 생성이 없이도 μ ‘κ·Ό κ°€λŠ₯
    Aclass.typeProperty = 123
    
    print(Aclass.typeProperty)  // 200
    print(Aclass.typeComputedProperty)  // 200
  • 예제 2

    일반 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” 클래슀/κ΅¬μ‘°μ²΄μ—μ„œλ§Œ λ˜μ§€λ§Œ μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν˜•μ—μ„œλ„ κ°€λŠ₯

    enum SomeEnumeration {
    
    static var storedTypeProperty = "Some value."
    
    static var computedTypeProperty: Int {
           return 6
        }
    }
  • 예제 3

    클래슀 νƒ€μž…μ— λŒ€ν•œ μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°(Computed type property)의 경우, "class" ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΈŒν΄λž˜μŠ€κ°€ 슈퍼클래슀의 κ΅¬ν˜„μ„ μž¬μ •μ˜(override)ν•  수 μžˆμŠ΅λ‹ˆλ‹€

    class SomeClass {
    
        static var computedTypeProperty: Int {
            return 27
        }
    
        // class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œμ˜ μž¬μ •μ˜ ν—ˆκ°€
        class var overrideableComputedTypeProperty: Int {
            return 107
        }
    }
    
    class ChildSomeClass : SomeClass{
        override static var computedTypeProperty: Int {
            return 27 //error! cannot override static var
        }
    
        override static var overrideableComputedTypeProperty: Int{
            return 2222
        }
    }