Home » Encode arbitary value

Encode arbitary value

Swift :: Encode and Decode a value type’s instance

임의의 Struct, Enum 타입을 인코딩하라.

임의의 값 타입을 인코딩하는 법을 찾아보자. (클래스의 경우에는 NSCoding이 있으니…) 먼저 인코딩이 필요한 함수를 생각해보자. NSData는 특정 포인터와 그 길이를 가지고 데이터를 만들 수 있다. NSData(bytes:UnsafePointer<T>, length:Int) 여기서 크기는 타입의 크기인데, C와 같이 Swift도 sizeof() 함수를 제공한다. (C에서는 연산자이다.)
Swift에서 inout T 타입과 UnsafePointer<T> 타입은 구분되므로 (T가 옵셔널인 경우에는 포인터로 간주될 수 있다.) 보조 함수인 withUnsafePointer<T>(_:_:) 함수를 사용하여 inout 으로 넘긴 T 타입을 포인터로 바꿀 수 있다.
따라서 인코드 함수는 다음과 같이

func encode<T>(var value:T) -> NSData {
    let data = withUnsafePointer(&value){
        (p:UnsafePointer<T>) -> NSData in
        return NSData(bytes:p, length:sizeof(T.Type))
    }
    return data
}

작성할 수 있다. 디코드하는 함수는? 이건 영락없이 포인터를 만들어서 메모리를 신규로 할당하고 여기에 바이트를 채워넣는 수 밖에 없어보인다. (물론 NSValue로 만들어서 내놓는 방법이 있는데, Swift는 아직 @encode를 쓸 수 없다.)
그래서 UnsafeMutablePointer<T> 타입을 이용해서 실제로 포인터를 다뤄보자.더 보기 »Swift :: Encode and Decode a value type’s instance