Swift의 lazy
키워드는 Property를 정의할 때 사용되며, 정의 이후에 실제로 해당 Property에 접근되어질 때 초기화 된다. 이미지를 나타내기 위한 Struct가 있다고 가정하자(아래의 예시). 이미지의 metadata dictionary는 Memory에서 많은 공간을 차지하며, 우리는 해당 데이터가 사용되거나 사용되지 않아도 해당 metadata dictionary를 가지고 있어야 한다. Memory 공간을 효율적으로 사용하기 위해, lazy
는 아래의 예시처럼 사용된다.
struct Image {
lazy var metadata: [String:Any] = {
// Load image file and parse metadata
// (expensive)
...
return ...
}()
}
우리는 Property 정의를 위해 var
를 사용한다. let
상수는 항상 Instance 초기화가 완료되기 이전에 값을 가지기 때문에, lazy
를 사용할 수 없다.
Property의 초기 값은 Instance에 처음 접근할 때 할당되므로, lazy
Property에 접근하는 것은 값의 수정과 같다. Stuct가 lazy property를 보유하고 있을 때, 값 유형인 Struct에 lazy property가 포함된 경우, lazy property에 액세스하는 struct의 소유자는 해당 property에 액세스하는 것이 잠재적으로 컨테이너를 변경하는 것을 의미하므로 Struct를 변수로 선언해야 한다. --> lazy를 사용한 Struct나 Class Instance를 초기화 하는 경우, var
로 설정해야 한다는 말.ㅎ
let image = Image()
print(image.metadata)
// error: Cannot use mutating getter on immutable
// value: 'image' is a 'let' constant.