swift_관찰자 모드

1918 단어
관찰자 모델은 iOS 개발에서 상당히 광범위하게 응용된다. 즉:Key-Value Observing은 지정된 대상의 속성(상응하는 keyPath)이 수정되면 대상이 알림을 받는 메커니즘을 제공한다.쉽게 말하면 지정된 관찰 대상의 속성이 수정될 때마다 KVO는 자동으로 해당 관찰자에게 통지한다.
swift에서 KVO를 사용하는 것은 OC보다 약간 제한적입니다.
  • NSObject의 하위 클래스: 관찰자와 피관찰자는 모두 NSObject의 하위 클래스여야 합니다.OC에서 KVO의 실현은 KVC와runtime 메커니즘을 바탕으로 하기 때문에 NSObject의 하위 클래스만이 이러한 특성을 이용할 수 있다.
  • @dynamic: 관찰된 사용자 정의 클래스의 속성은 @dynamic 키워드로 수식해야 합니다.

  • 상기 두 가지 조건은 이전에 OC에서 KVO를 사용하여 특정한 매거 속성의 type의 변화를 관찰했기 때문에 swift에서는 통하지 않는다. 물론 swift의 구조체와 범형도 포함한다.
    다음은 swift에서 kvo를 실현하는 것을 보겠습니다.
    사용자 정의 클래스
    import UIKit
    
    class FLObbserve: NSObject {
        dynamic var name:String? //dynamic     runtime  
        override init() {
            name = "123"
            super.init()
            
            addObserver(self, forKeyPath: "name", options: .new, context: nil)
        }
        
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            print("kvo is valid")
        }
        
        deinit {
            removeObserver(self, forKeyPath: "name")
        }
    }
    

    실행 후 외부 수정name 속성, 콘솔 인쇄 결과: kvo is valid이로써 상기 두 가지 조건을 실현한 후 사용자 정의 클래스에 kvo를 추가했다.
    그러면 Struct, Enum 값 유형의 관찰자 모드는 어떻게 실현됩니까?여기서 우리는 하나의 속성 관찰기의 개념을 도입해야 한다. Swift에서 하나의 속성에 속성 관찰기를 설정할 수 있다. 이것은 내장된 KVO 관찰이라고 할 수 있지만 자신의 속성에 대한 관찰에만 국한된다.코드 보기:
    //MARK:  
        var direction:Direction {
            willSet{ // direction 
            }
            didSet { // direction 
                changeDirection(direction: direction)
            }
        }
    
    

    여기서 Direction는 사용자 정의 열거 속성 관찰기가 초기화가 완료된 후에만 터치하고 NSObject의 하위 클래스에 국한되지 않으며 Swift의 모든 Class, Struct, Enum에서 사용할 수 있다.여기서 Array, Dictionary, Set 등 값 유형은 그 내용에 대한 수정(증가/삭제/교체) 요소도 속성 관찰기를 촉발한다.Array, Dictionary, Set 등 값 유형이 바뀌면 새로운 내용을 변수로 복사하고 변수의 주소도 바뀌기 때문이다.

    좋은 웹페이지 즐겨찾기