TIL24 ✨

YaR Lab·2023년 5월 25일
0

TIL✨

목록 보기
14/135
post-thumbnail

23.05.25

didset

fileprivate

private : 같은 클래스
fileprivate : 같은 소스 파일(.swift)
internal : 같은 모듈(framework) or 같은 프로젝트
public : 모듈 외부까지 가능
open : 모듈 외부, 상속 및 override가능(확장 가능)

접근제한자

KVO

https://zeddios.tistory.com/1220
https://zeddios.tistory.com/1218

KVO

주어진 코드에서 오류가 발생하는 이유는 Inventory 속성의 이름이 대문자로 시작하고 KVO로 관찰하기 위해 @objc dynamic 속성을 사용하지만, 관찰할 때는 소문자로 시작하는 속성 이름을 사용했기 때문입니다. 속성 이름을 일치시켜서 코드를 수정해야 합니다.

다음은 수정된 코드입니다:

import UIKit

class FruitStore: NSObject {
    @objc dynamic var inventory: [Int] = [1, 2, 3]
}

class JuiceMaker {
    var fruitStore: FruitStore = FruitStore()
}

class ViewController: UIViewController {
    var observation: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()

        let juiceMaker = JuiceMaker()
        observation = juiceMaker.fruitStore.observe(\.inventory, options: [.old, .new]) { object, change in
            print("Current Object: \(object)")
            print("Old Value Before Changed: \(change.oldValue)")
            print("New Value After Changed: \(change.newValue)")
        }

        juiceMaker.fruitStore.inventory[0] = 3
    }
}

수정된 코드에서는 FruitStore 클래스의 Inventory 속성을 inventory로 변경하고, JuiceMaker 클래스의 juicemakerjuiceMaker로 수정했습니다. 그리고 JuiceMakerfruitStore 속성을 관찰할 때도 \.inventory로 변경하여 일치시켰습니다.

이제 코드가 오류 없이 실행되며, 속성 변경 시 관찰자 클로저가 호출되어 변경된 값을 출력합니다.

뷰간 인스턴스 전달

ViewController의 인스턴스를 다른 뷰 컨트롤러에 전달하는 방법은 여러 가지가 있습니다. 몇 가지 일반적인 방법을 살펴보겠습니다:

  1. Segue를 통한 전달: prepare(for:sender:) 메서드를 사용하여 ViewController의 인스턴스를 다른 뷰 컨트롤러로 전달할 수 있습니다. Segue를 통해 다른 뷰 컨트롤러로 이동할 때 prepare(for:sender:) 메서드가 호출되며, 해당 메서드에서 ViewController의 인스턴스를 전달할 수 있습니다.

  2. 의존성 주입(Dependency Injection): 의존성 주입을 사용하여 ViewController의 인스턴스를 다른 뷰 컨트롤러로 전달할 수 있습니다. 이를 위해 OtherViewControllerViewController를 의존성으로 가지고 있고, 생성자 또는 프로퍼티를 통해 ViewController의 인스턴스를 전달할 수 있습니다.

  3. Singleton 패턴: Singleton 패턴을 사용하여 ViewController의 인스턴스를 전역적으로 접근 가능하게 만들고, 다른 뷰 컨트롤러에서 해당 인스턴스를 참조할 수 있습니다. 이를 위해 ViewController 클래스에 공유 인스턴스를 생성하는 정적 메서드를 추가하고, 다른 뷰 컨트롤러에서 해당 메서드를 사용하여 인스턴스에 접근할 수 있습니다.

위의 방법 중 선택은 프로젝트의 구조와 요구사항에 따라 달라질 수 있습니다. 의존성 주입이나 Singleton 패턴은 코드 간 결합도를 낮추고 테스트 용이성을 높일 수 있는 장점이 있지만, 프로젝트의 규모와 복잡도에 따라 적합한 방법을 선택해야 합니다.

0개의 댓글