Swift 프로퍼티의 옵저버에 대한 규칙

  • lazy 프로퍼티는 옵저버를 가질 수 없다. (단 최초 액세스 이후 변경하는 것은 가능하다.)
  • computed 프로퍼티에 대해서는 옵저버를 설치하는 것이 의미가 없다. 단 상속받은 computed 프로퍼티에 대해서는 옵저버를 설치할 수 있다.
  • 옵저버는 해당 클래스의 지정 이니셜라이저 내에서 값을 변경하는 경우에는 호출되지 않는다.
  • 단, 상속받은 프로퍼티가 옵저버가 설치되어 있다면 부모의 지정 이니셜라이저 호출 후에 변경한다면, 부모의 옵저버가 호출될 것이다.
  • 비슷하게 편의 이니셜라이저에서는 지정 이니셜라이저를 통해 초기화한 후, 프로퍼티값을 다시 변경하면 옵저버가 실행된다.

lazy 프로퍼티와 옵저버

lazy 프로퍼티는 옵저버를 가질 수 없다. 위에서 설명한 옵저버와 관련된 규칙들을 살펴보면, 다음과 같은 가설을 세울 수 있다. 1) 옵저버는 객체 인스턴스의 초기화가 완료된 시점부터 작동한다. 2) 객체의 초기화는 지정 이니셜라이저가 실행을 완료한 시점으로 본다.

그런데 lazy 프로퍼티는 약간 예외적이다. 왜냐하면 지정이니셜라이저가 실행을 완료했다하더라도 느긋하게 초기화되는 프로퍼티는 아직 초기화 되기 전이기 때문이다. 따라서 위 가설에서 1번 항목에 따라 지정 이니셜라이저가 실행되었더라도 옵저버가 동작 가능한 시점이 결정되지 않는다. 아래는 이 부분이 언급된 공식 문서의 내용.


You can add property observers to any stored properties you define, except for lazy stored properties. You can also add property observers to any inherited property (whether stored or computed) by overriding the property within a subclass. You don’t need to define property observers for nonoverridden computed properties, because you can observe and respond to changes to their value in the computed property’s setter. Property overriding is described in Overriding.

상속된 계산 프로퍼티에는 옵저버 설치가 가능하다?

보통 옵저버는 저장 프로퍼티에 설치한다. 계산 프로퍼티의 경우에는 set 하는 과정 자체가 별도의 코드를 실행하는 것이므로 사실상 옵저버가 필요 없다. 하지만 이렇게 set이 가능한 계산 프로퍼티에 대해서 이를 상속받는 서브 클래스는 해당 프로퍼티를 오버라이드하여 didSet, willSet 옵저버만 추가하는 것이 가능하다. (당연히 setter를 오버라이드하는 경우에는 옵저버를 추가할 수 없다.)

코코아바인딩에서 집합 타입의 프로퍼티를 연결할 때 유의할 점

코코아 바인딩을 사용할 때 특정한 키 이름이 변경가능한 배열(NSMutableArray)일 때, UI를 통해 값을 추가/제거하거나 변경한다 하더라도 이러한 변경이 원래 데이터에 반영되지 않는 문제가 발생하는 경우가 있다.

원문 : 코코아 바인딩 문제해결(Troubleshooting Cocoa Bindings)
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/Troubleshooting.html

집합 컨트롤러가 현재 데이터를 표시하지 않아요.

“이러한 문제는 보통 여러분의 애플리케이션이 집합 콘텐츠를 키-밸류 옵저빙 호환 방식으로 데이터를 변경하지 않기 때문에 일어납니다. 배열을 addObject:removeObject: 로 제거하는 것만으로는 부족합니다.”

코코아바인딩에서 집합 타입의 프로퍼티를 연결할 때 유의할 점 더보기

예제로 알아보는 argparse 사용법

몇 년 전에 argparse의 사용법을 간단하게 정리한 글을 발행했는데, 우연히 몇 가지 찾아보다 보니 기능설명의 나열만 읽어봐서는 애매한 부분도 많고 원하는 형태로 설정하는 것도 계속 헷갈려서 큰 맘 먹고 총정리 하는 마음으로 새로운 글을 하나 써보기로 마음 먹었다. 오늘은 명령줄 인자를 파싱하는 도구인 argparse를 어떻게 사용하는지, 그리고 몇몇 경우에 있어서 옵션의 동작을 어떻게 설정하는지를 좀 더 자세히 살펴보고자 한다.

예제로 알아보는 argparse 사용법 더보기

Asyncio를 사용한 비동기 소켓 통신

이 블로그에서는 파이썬으로 소켓 통신을 구현하는 몇 가지 방법을 이미 살펴본 바 있습니다. 원시 소켓인 socket.socket을 사용하는 방법zmq의 REQ-REP 패턴을 사용한 방법이 있었고, 다중 접속을 허용하도록 스레드를 통해 처리하거나, 셀렉터를 사용하여 단일 스레드에서 멀티플렉싱하는 방법도 알아보았습니다. 이번 글에서는 asyncio에서는 과연 소켓 통신을 어떤식으로 구현하는지 살펴보고 역시나 간단한 비동기 다중 접속 에코 서버를 구현하는 과정을 함께 살펴보겠습니다.

Asyncio를 사용한 비동기 소켓 통신 더보기

[Python] 클래스 구현 예제 – Vector

지난 시간에 이어서 간단한 클래스 예제를 통해서 클래스를 작성하고 활용하는 방법을 살펴보도록 하겠다. 그리고 객체가 가지는 추가적인 비밀스런(?) 메소드나 속성에 대해서도 조금 더 알아보겠다.

개인적으로 데이터나 함수를 묶어두는 용도로 굳이 클래스를 써야하는가에 대해서는 회의적인 입장이다. 모든 객체인스턴스는 속성이나 메소드를 참조하기 위해서는 내부적인 lookup 과정을 거치기 때문에 사실상 사전으로 대체하는 것도 무방하다고 생각한다. 그럼에도 불구하고 이번에는 클래스로 정의해두는 것이 훨씬 더 사용성을 높이고 편리하게 사용될 수 있는 케이스에 대해서 접근해보겠다.

[Python] 클래스 구현 예제 – Vector 더보기