ios dev kangwook.

Swift) Property 본문

Swift

Swift) Property

kangwook 2022. 9. 25. 15:57

Property

Property는 값을 특정 클래스, 구조체, 열거형과 연결한다. Property에는 크게 3가지 종류가 있다!

  • Stored Property(저장 프로퍼티)
  • Computed Property(연산 프로퍼티)
  • Type Property(타입 프로퍼티)

Stored Property

  • 상수와 변수값을 인스턴스의 일부로 저장하고, 클래스와 구조체에서만 사용한다.
  • 클래스의 일부가 되는 상수(Constant) / 변수(Variable)라고 할 수 있겠다.

Stored Property(struct)

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
 
var rangeOfThreeItems = FixedLength(firstValue: 0, length: 3)
 
rangeOfThreeItems.firstValue = 6    // rangeOfThreeItems가 상수로 선언되면 이 부분도 error 발생
rangeOfThreeItems.length = 10       // error!

Stored Property(class)

class FixedLengthRange {
    var firstValue: Int
    let length: Int
 
    init(firstValue: Int, length: Int) {
        self.firstValue = firstValue
        self.length = length
    }
}
 
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
 
rangeOfThreeItems.firstValue = 3    // class는 let으로 바꿔도 이 부분이 error가 나지 않음
rangeOfThreeItems.length = 10       // error!

lazy stored property

  • lazy로 선언된 프로퍼티는 인스턴스에 접근하기 전까지 생성이 되지 않는 것을 뜻한다.
  • lazy는 항상 변수로서 선언해야한다.
class DataImporter {
    var filename = "data.txt"
}
 
class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
}
 
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// 여기까지 진행해도 DataImporter의 인스턴스인 importer 프로퍼티는 생성되지 않았음
 
// importer 프로퍼티에 처음 액세스 할 때 만들어지게 됨
print(manager.importer.filename)

Computed Property

  • 값을 연산하는 프로퍼티라고 보면 된다.
  • 특정 연산을 수행하여 값을 "반환"하기 때문에 return을 써서 값을 반환해준다.
  • 클래스, 구조체, 열거형에서 모두 사용가능하고, getter와 setter를 통해 다른 프로퍼티와 간접적으로 값을 검색하고 세팅하는 프로퍼티이다.
class Point {
    var tempX: Int = 1
    var x: Int {
        get {
            return tempX
        }
        set(newValue) {
            tempX = newValue * 2
        }
    }
}
 
var p: Point = Point()
p.x = 12   
print(p.x) // 24
// p.x = 12를 하면 x에 값이 저장되는 것이 아니라 연산이 되어 newValue * 2를 한 24가 저장

Read-Only Computed Property

  • set만을 가질 수 없지만 get만을 가질 수는 있다(말 그대로 Read-Only)
struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

Type Property

  • 프로퍼티를 타입 자체와 연결하는 것. 인스턴스와 연결하는 것이 아니다.
  • 저장 타입 프로퍼티와 연산 타입 프로퍼티로 이루어진다.
  • class / static을 프로퍼티 앞에 삽입함으로써 선언하는데 차이점이 있다.
    • class 타입의 경우 프로퍼티를 오버라이딩할 수 있고 static의 경우 불가능하다!
struct SomeStructure {
    ...
}
enum SomeEnumeration {
    ...
}
class SomeClass {
    ...
}
 
// 타입 프로퍼티는 인스턴스가 아닌 타입자체를 통해 프로퍼티에 접근
print(SomeStructure.storedTypeProperty)
// Prints "Some Value."
SomeStructure.storedTypeProperty = "Another Value."
print(SomeStructure.storedTypeProperty)
// Prints "Another Value."
print(SomeEnumeration.computedTypeProperty)
// Prints "6"
print(SomeClass.computedTypeProperty)
// Prints "27"

 

참조

 

 

'Swift' 카테고리의 다른 글

Swift) Enumeration  (0) 2022.10.04
Swift) Initialization  (0) 2022.10.02
Swift) Semaphore  (0) 2022.09.25
Swift) DispatchQueue  (0) 2022.09.22
Swift) Concurrency, GCD  (0) 2022.09.20
Comments