태그 보관물: Objective-C

IUO 를 인자로 받는 함수 (Swift)

IUO타입을 인자로 선언한 함수들이 있는데, 이들은 주로 Objective-C/C API에서 발견된다. Objective-C에서 임의의 객체를 의미하는 id 타입은 항상 nil 일 수 있기 때문에 파라미터 타입을 AnyObject 가 아닌 기대하는 타입의 옵셔널로 받는 것이다. 하지만 이러한 API의 내부에서는 대부분 해당 값에 대해서 null 검사를 엄밀히 하지 않거나 하지 않아도 되는 경우가 많다.1

또한 C-API에서도 흔히 볼 수 있다. 이들은 임의의 포인터 혹은 불투명 타입[^1]을 인자로 받는데, C언어의 특성상 nil을 다른 값과 구분할 수 없는데, Swift 입장에서는 nil이 곧 NULL이기 때문에 옵셔널을 보낼 수 있게 되기 때문이다. 따라서 어떠한 API의 인자가 !으로 선언된 암묵적 언래핑 옵셔널을 사용한다고 할 때, 이를 사용하는 측면에서는 다음의 당연한 두 가지 접근법 중 하나를 취하게 된다.

  1. 옵셔널에 대해서 nil 체크를 하고 언래핑하여, 최종적으로는 옵셔널이 아닌 타입의 값만 넘긴다.
  2. 옵셔널 값을 그냥 넘겨준다.

2의 경우에는 자신이 무엇을 하고 있는지 정확히 파악되는 경우에만 시도해야 한다. Objective-C/C API 내부에서는 받은 인자의 값이 NULL이더라도 어떠한 동작을 하게끔 시도할지는 몰라도, 그것은 감춰져서 알 수 없으며 혹시라도 nil 값이 그대로 넘어간 경우에는 런타임 에러로 직결되기 때문이다.

많은 C/Objective-C API에서 이러한 타입을 볼 수는 있다. 하지만 그것은 언어의 기능이 불안정성을 깔끔하게 덜어내지 못하고 많은 부분의 불안요소를 컴파일 타임을 넘어 런타임까지 짊어지고 갈 수 밖에 없는 한계를 가지기 때문에 그러한 디자인을 갖게 된 것이다. Swift는 언어 수준에서 불안정성을 최소화하고 컴파일 타임에서 발생할 수 있는 최대한의 범위의 에러를 미리 찾을 수 있는 기능을 제공하고, 지원한다. 그것을 이용하고 지키는 습관은 단순히 타이핑을 몇 자 덜하는 것보다 훨씬 더 생산적이며, 나아가 C가 아닌 Swift의 디자인과 패러다임을 통한 사고의 틀을 만드는 것에 보다 빨리 익숙해지게 한다.

Swift에서 T! 타입을 인자로 받는 함수를 정의하기

이런 타입 시그니처는 함수 작성시에 당연히 쓸 수 있는 표현이기 때문에 그러한 타입의 인자를 받는 함수를 정의할 수는 있다. 하지만 앞에서도 말했듯이 그럴 필요가 있을 케이스가 있을 가능성이 0%이다. 받으려는 값이 항상 있어야하는 경우에는 T 타입을 쓰면 되고, 없거나 실패할 수 있는 가능성이 있다면 옵셔널을 쓰면 된다. 그 외의 경우는 없다.


  1. Objective-C에서는 nil에 어떤 메시지를 보내면 그냥 무시되기 때문에. 

코코아 바인딩이란

코코아 바인딩

기능적인 측면에서 가장 단순하게 설명하면, 코코아 바인딩은 모델과 뷰 사이에 어떠한 글루코드 없이 값과 디스플레이되는 것을 동기화시키는 것이다. 즉 바인딩을 구성하면 값이 바뀔 대 별도의 처리 없이 자동으로 뷰가 업데이트되고, 뷰에서 변경이 일어나면 즉시 값이 변경되는 것을 코드 없이 구현한다는 것이다.

즉 작성/유지해야 하는 코드의 양을 최소화하면서 이러한 기능을 제공한다. 코코아 바인딩을 적용하기 위해서 기존 코드를 재작성할 필요도 없다.
Continue reading “코코아 바인딩이란” »