2014-09-25 2 views
1

스위프트에서 원시 데이터로 재생 나는 뭔가 이해가 가지 않는 것을 발견했습니다. 처음 바이트 매개 변수를 명확하게 UnsafePointer 유형입니다NSData (bytes : length :)는 [Byte]를 UnsafePointer <Void>으로 Swift에서 어떻게 변환합니까?

init(bytes: UnsafePointer<Void>, length: Int) 

:
을 NSData 생성자가 있습니다.
그러나,이 생성자에 [Byte] 개체를 전달하면 컴파일러에서 불평하지 않을뿐만 아니라 제대로 작동합니다.
하지만 캐스팅하려고하면 [Byte] to UnsafePointer, 실패합니다.
어떻게 작동합니까?

예를 들어 (당신이 놀이터에서 그것을 시도 할 수 있습니다) : 나는

UnsafePointer<Void>(buffer) 

을 수행 할 수 있습니다 알고

let buffer: [Byte] = [0x00, 0xff] 
let data = NSData(bytes: buffer, length: buffer.count) // no error 
data.description 

var pointer: UnsafePointer<Void> 
// comment this line to avoid compiler error 
pointer = buffer // error 

을하지만 내 질문은, 무엇을 NSData 생성자를 수행하는 것은 '나는 돈 것을 암시 할 그럴 필요가 없습니다.

답변

3

Swift는 필요한 C 함수를 호출 할 때 자체 포인터를 C 포인터에 매핑합니다. 애플은이 상호 작용에 대해 약간의 문서를 가지고있다 : Interacting with C APIs. 당신이 UnsafePointer<Type>을받는 함수를 호출 할 때, 그것은 nil, 해당 유형의 inout 변수, 해당 유형의 배열을 받아 들일 수 한마디로

(즉, [Type], 당신이 사용중인), 또는 1 일반적인 Swift 포인터 유형 중 하나입니다. UnsafePointer<Void>을 취하는 함수는 타입에 제약이없는 함수를 취할 수 있기 때문에 함수의 설명서를 읽고 원하는 결과를 반환해야합니다.

+2

"블로그 게시물"(https://developer.apple.com/swift/blog/?id=6)의 "포인터를 배열 매개 변수" – newacct