Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

이 글에서는 Objective-C로 SQLite3 데이터베이스에 액세스하는 API를 래핑한 간단한 클래스를 작성해보겠다. 사실 Objective-C로 SQLite3를 사용하는 것은 C API를 그대로 사용하면 되는 부분인데, 이렇게 래퍼를 만들면 브릿징헤더만 작성해주면 래퍼 클래스를 Swift에서 그대로 사용할 수 있게 되기 때문에 좀 더 쉽게 사용할 수 있다.

Swift에서 C헤더를 바로 반입할 수 있기 때문에 이 방식은 오히려 번거로울 수 있다. (특히 스펙이 약간만 변경되어도 Objective-C 클래스를 수정해야 한다.) 선택은 각자가 알아서 하시면 되겠다.

Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법 더보기

Chaining Multiple CIFilters

Chaining CIFilters

Swift의 문법적 특징은 Objective-C를 사용할 때보다 훨씬 더 간결하고 간단한 구조의 코드를 작성할 수 있게 해주는데, 이번에는 Swift의 문법을 활용하여 CIFilter를 연쇄적으로 적용하는 자료 구조를 만들어 보도록 하겠다.

기본적으로 하나의 이미지에 여러 개의 필터를 적용하는 경우에는 각 필터의 outputImage 속성을 다음 순서의 필터의 kCIInputImageKey로 전달하는 방식으로 처리할 수 있다.

이를 아예 연산자로 정의하는 것도 가능하다. 이미지 인스턴스는 필터라는 상태로 둘러싸여 그 내부에서 조작되는 엔티티로 볼 수 있기 때문에 필터 자체를 모나드로 볼 수 있다. Chaining Multiple CIFilters 더보기

[Swift] 값타입과 참조타입

값 타입과 참조 타입

https://developer.apple.com/swift/blog/?id=10

Swift의 타입은 크게 두 부류로 나뉘는데, 하나는 “값 타입”으로 각각의 인스턴스가 고유한 데이터의 사본을 가지고 있는 것으로 주로 구조체나 열거타입, 튜플등이 이에 해당된다. 다른 하나는 “참조 타입”으로 이는 각각의 인스턴스가 하나의 데이터 사본을 동시에 참조하는 것으로 클래스의 인스턴스가 여기에 해당한다. 이 글에서는 각 타입의 장점과 언제 어떤 타입을 사용해야 할지를 알아보겠다. [Swift] 값타입과 참조타입 더보기

[Swift] String 타입에 length 메소드가 없는 이유

Swift의 String 타입에는 length 프로퍼티나 메소드가 없다. 이상하게 들리겠지만 실제로 그렇다. Swift에서 문자열의 길이를 구하려면 이럼 메소드 대신에 countElements(_:)라는 글로벌 함수를 사용해야 한다.

더군다나 이 countElements(_:) 함수는 문자열을 처음부터 순회(iterate)하기 때문에 매우 긴 문자열을 다룰 때라면 주의해야 한다. NSStringlength 프로퍼티를 제공하는데 왜 Swift의 문자열 타입은 길이 프로퍼티를 갖지 않을까?

NSString은 내부적으로 유니코드 문자열(정확히는 일련의 코드값)을 UTF16 형식으로 인코딩한 값을 갖는다. UTF16에서는 각 유니코드 스칼라값은 16비트 크기의 값으로 변환된다. 여기서 주의할 것은 “한 개의 유니코드 문자”가 아닌 “한 개의 유니코드 값”이라는 점인데, 유니코드는 하나의 값이 다른 값과 조합되어 문자로 표기되는 경우가 종종 있기 때문이다. 이를 테면 U+301은 영문자 모음에 붙는 첨자인데, “café”를 표현할 때 e와 결합한다. 즉

var word = "cafe"
word += "\u{301}"
println(word)
//  café

이렇게 된다. 앞서 언급한 countElements() 함수는 이 때 é를 한 개 글자로 계산한다. 하지만 이 문자열을 표현할 때 사용된 실제 유니코드값은 5개이다. 이는 유니코드 문자열은 표현방식에 따라서 사용되는 메모리의 크기가 달라질 수 있다는 점이다. 따라서 불가피하게 조합가능한 유니코드 값들을 찾기 위해서는 문자열 내부를 순회하는 작업이 필요하고, 단순한 프로퍼티로는 이를 제공하지 않는다.

println(countElements(word))
//  4

반대로 NSString의 길이는 사용된 유니코드값들이 16비트 단위로 저장되므로 “문자열의 길이”가 곧 사용된 정보의 개수와 같다. 따라서 “몇 자”가 아닌 “몇 개의 유니코드 값”의 의미가 된다.

println(NSString(format:"%s", word).length)
//  5

물론, Swift 문자열이 NSString의 length 프로퍼티와 같은 값을 구하고자 한다면 utf16Count라는 프로퍼티를 사용하면 된다.

println(word.utf16Count)
//  5

끗.