-
Swift Property - 2Programming/Swift(iOS) 2021. 4. 1. 23:11728x90
그렇다면 프로퍼티에서 적합하지 않은건 무엇일까요?
오래 걸리는 계산등은 프로퍼티에서 적합하지 않습니다.
이미지를 다운받고 , 그리는 코드가 있다고 해봅시다.
이때, 2번 연속 draw()를 호출하게 되면 ...image를 접근할 때마다 다운로드를 받아야합니다.
struct UIImage { let url:String } struct Image { let url:String //계산형 프로퍼티는 시간이 오래걸리는 작업에 적합하지 않다. var image:UIImage { print("Donwload image from \(url)") sleep(1) return UIImage(url:url) } //draw를 할때마다 다운로드 받는다...lazy를 이용해서 처음 접근할때만 초기화하고, func draw() { print("Draw Image - \(image)") } } var image = Image(url:"https://a.com/b.png") image.draw() image.draw()
우리는 다운로드를 매번 받는게 아니라, 한번만 다운로드하고, 그 다음부터는 그냥 그려주기만을 원합니다.
그렇다면 어떻게 해야될까요?
답은 lazy입니다.
첫 접근시에만 다운을 받고, 그 이후에는 다시 다운받지 않게 됩니다.
struct UIImage { let url:String } struct Image { let url:String lazy var image:UIImage = loadImageFromUrl() private func loadImageFromUrl() -> UIImage { print("Download image from \(url)") sleep(1) return UIImage(url:url) } // image를 변경하기 때문에 mutating 필수! mutating func draw() { print("Draw Image - \(image)") } // mutating을 사용하기 때문에 var로 선언 var image = Image(url:"https://a.com/b.png") //한번만 다운받고 draw에서는 읽어오기만 한다. image.draw() image.draw()
lazy 사용시 주의사항!
1. 저장형 프로퍼티기입니다. 따라서 값을 변경하기 때문에 가변객체(var)로 선언해야됩니다.
2) struct의 경우 저장 프로퍼티는 초기화 코드가 자동으로 들어갑니다. 하지만 lazy var는 외부에서 초기화 될 경우에 의도된 동작으로 수행되지 않을 수 있습니다.
-> 사용자 초기화를 하는게 낫습니다.
3) setter를 통해서 image가 외부에서 변경될 경우에는 제대로 수행되지 않을 수도 있습니다.
-> private(set) 을 이용해서 내부에서만 접근 가능하도록 해줍니다.
'Programming > Swift(iOS)' 카테고리의 다른 글
Swift Optional - 1 (0) 2021.04.02 Swift Property - 3 (0) 2021.04.01 Swift Property - 1 (0) 2021.04.01 Swift Enum - 4 (0) 2021.04.01 Swift Enum - 3 (0) 2021.04.01