private : 같은 클래스
fileprivate : 같은 소스 파일(.swift)
internal : 같은 모듈(framework) or 같은 프로젝트
public : 모듈 외부까지 가능
open : 모듈 외부, 상속 및 override가능(확장 가능)
https://zeddios.tistory.com/1220
https://zeddios.tistory.com/1218
주어진 코드에서 오류가 발생하는 이유는 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
클래스의 juicemaker
를 juiceMaker
로 수정했습니다. 그리고 JuiceMaker
의 fruitStore
속성을 관찰할 때도 \.inventory
로 변경하여 일치시켰습니다.
이제 코드가 오류 없이 실행되며, 속성 변경 시 관찰자 클로저가 호출되어 변경된 값을 출력합니다.
ViewController
의 인스턴스를 다른 뷰 컨트롤러에 전달하는 방법은 여러 가지가 있습니다. 몇 가지 일반적인 방법을 살펴보겠습니다:
Segue를 통한 전달: prepare(for:sender:)
메서드를 사용하여 ViewController
의 인스턴스를 다른 뷰 컨트롤러로 전달할 수 있습니다. Segue를 통해 다른 뷰 컨트롤러로 이동할 때 prepare(for:sender:)
메서드가 호출되며, 해당 메서드에서 ViewController
의 인스턴스를 전달할 수 있습니다.
의존성 주입(Dependency Injection): 의존성 주입을 사용하여 ViewController
의 인스턴스를 다른 뷰 컨트롤러로 전달할 수 있습니다. 이를 위해 OtherViewController
가 ViewController
를 의존성으로 가지고 있고, 생성자 또는 프로퍼티를 통해 ViewController
의 인스턴스를 전달할 수 있습니다.
Singleton 패턴: Singleton 패턴을 사용하여 ViewController
의 인스턴스를 전역적으로 접근 가능하게 만들고, 다른 뷰 컨트롤러에서 해당 인스턴스를 참조할 수 있습니다. 이를 위해 ViewController
클래스에 공유 인스턴스를 생성하는 정적 메서드를 추가하고, 다른 뷰 컨트롤러에서 해당 메서드를 사용하여 인스턴스에 접근할 수 있습니다.
위의 방법 중 선택은 프로젝트의 구조와 요구사항에 따라 달라질 수 있습니다. 의존성 주입이나 Singleton 패턴은 코드 간 결합도를 낮추고 테스트 용이성을 높일 수 있는 장점이 있지만, 프로젝트의 규모와 복잡도에 따라 적합한 방법을 선택해야 합니다.