한 점이 삼각형 내부에 있는지를 체크하기

평면좌표상의 임의의 점 P(p_1, p_2) 가 세 점 A(a_1, a_2), B(b_1, b_2), C(c_1, c_2)로 이루어진 삼각형 내부에 있는지 외부에 있는지를 판단하는 코드를 작성해보자. 이거 마치 무슨 고등학교 수학문제 같은데, 사실 고등학교 수학 문제 맞다…

한 점이 삼각형 내부에 있는지를 체크하기 더보기

복사/붙여넣기를 지원하는 Swift 타입 작성하기 2

복사/붙여넣기를 지원하는 타입을 작성할 때, 해당 타입은 반드시 직렬화 및 역직렬화가 가능해야 했다. 그런데 NSPasteboardReading 프로토콜은 지정 이니셜라이저를 포함하고 있기 때문에 클래스를 직접 수정하거나 서브클래싱하지 않으면 이 방법을 적용할 수가 없다. 따라서 NSPasteboardItem을 대신 사용하는 방법을 적용해야 한다. 이 때 핵심은 해당 클래스가 어떤 모종의 방법을 사용해서 직렬화 및 역직렬화가 가능해야 한다는 점이다.

복사/붙여넣기를 지원하는 Swift 타입 작성하기 2 더보기

(Swift) 프로토콜 그 자체가 자신을 따르지 않는다

Swift 5.1에 추가된 some 키워드 (불투명 리턴 타입)에 관한 Swift 공식 문서를 살펴보다가 이상한 구절을 발견했다.

Another problem with this approach is that the shape transformations don’t nest. The result of flipping a triangle is a value of type Shape, and the protoFlip(_:) function takes an argument of some type that conforms to the Shape protocol. However, a value of a protocol type doesn’t conform to that protocol; the value returned by protoFlip(_:) doesn’t conform to Shape. This means code like protoFlip(protoFlip(smallTriange)) that applies multiple transformations is invalid because the flipped shape isn’t a valid argument to protoFlip(_:).

프로토콜 타입의 값이 그 프로토콜을 따르지 않는다는 것이다. 왱? 이게 뭔말이지? 특정한 프로토콜을 따르는 객체들은 그 실제 타입에 상관없이 해당 프로토콜을 타입처럼 사용할 수 있다고 했는데, 이번에는 프로토콜 타입의 값이 그 프로토콜을 따르지 않는다라니?

(Swift) 프로토콜 그 자체가 자신을 따르지 않는다 더보기

(Swift) Float 타입 사용법

Float 타입은 32비트 부동 소수점 숫자를 다루기 위해 제공되는 기본 타입이다. 64비트 정밀도를 가지는 Double 타입도 제공된다.


지수(exponent)와 가수(significand)에 대해

컴퓨터에서 사용하는 부동소수점 숫자는 기본적으로 근사값이다. 모두들 알다시피 컴퓨터는 내부적으로 모든 데이터를 이진수로 표현한다. 정수나 자연수에 있어서 진법은 특정한 값을 표시하는데 있어서 필요한 숫자의 개수만 달라지지만 소수점 이하의 값에 대해서는 그 사정이 다르다. 먼저 10진수 13을 생각해보자. 13은 10 + 3 이며 이를 10을 밑으로 하는 다항식으로 쓰면 1 \times 10^1 + 3 \times 10^0 의 꼴로 표현된다. 같은 식으로 이 값을 이진수로 표현하면 1011(2)가 되는데, 이 표현은 다시 이는 1\times2^3 + 0\times2^2 + 1\times2^1 + 1\times2^0 이라는 의미이다.

(Swift) Float 타입 사용법 더보기

FileHandle 사용법

NSData 클래스에는 해당 객체의 데이터를 URL에 기록하는 write(to:atomically:) 라는 메소드가 존재한다. 이 때 atomic하게 쓴다는 말은 온전한 데이터를 기록하거나 혹은 아예 기록하지 않거나 둘 중 하나의 결과만 존재하며, 그 중간인 부분적으로 소실되어 잘못된 데이터가 존재하지 않는다는 것을 말한다.

NSDataNSMutableData의 값 시멘틱 타입인 Data에는 해당 메소드가 존재하지 않는다. 대신 write(to:options:) 메소드가 존재하며, NSData.WritingOptions 타입에 .atomic 값이 정의되어 있어서 동일한 동작을 구현하는데에는 문제가 없다.

파일을 atomic하게 기록하는 방법은 임시 파일을 사용하는 것이다. 하나 혹은 그 이상의 임시 파일을 생성하여 데이터를 기록한 후에, 이상 없이 모든 데이터를 기록하게되면 해당 임시 파일을 최종 목적 파일로 교체하거나 복사하는 방식으로 파일 데이터가 중간에 깨지지 않게 하는 것이다.

FileHandle 사용법 더보기