2014-06-09 5 views
3

일부 코드를 Swift로 포팅하는 중 포인터를 처리하는 방법이 혼란 스럽습니다. 스위프트에서 COpaque 메모리 블록의 임의의 바이트에 대한 포인터


, 은 어떻게 C의 기능이에 액세스 할 수있는 방식으로, 메모리의 빈 블록을 만들려면 어떻게해야합니까?

C 소스 :

UInt8* bytes = malloc(qty_bytes_in_file); 

.. 그리고, 그래서-수행 한 후, 어떻게 당신이 메모리의 오프셋 (offset) 임의의 포인터를 만들 것인가? C 함수가 데이터를 쓰는 메모리 블록에서 포인터를 여러 주소로 반복적으로 이동해야합니다.

C 소스 :

C 소스 : 당신이 두 상황에서 라인을 볼 수 있도록

다음
void* mData = &bytes[i]; 

, 내가 시작하고있는 C 코드의 축약 버전입니다 :

UInt8* bytes = malloc(qty_bytes_in_file); // Swift equivalent? 

while (!err) { 

    AudioBufferList buffer_list = new_buffer_list(); 

    buffer_list.mBuffers[0].mData = &bytes[i]; // Swift equivalent? 

    // each iteration, ExtAudioFileRead fills 
    // in a portion of buffer_list's '.mData': 
    err = ExtAudioFileRead(
     audio_file, 
     &qty_frames_requested, 
     &buffer_list 
    ); 

    i += foo; 

} 
+1

나는 obj-c 래퍼를 만들 것이다. 순수한 스위프트에서하는 것은 너무 어려울 것입니다. 그러나 시작점은'UnsafePointer '이며, malloc을 활성화 할 수 있습니다.하지만 알다시피,'reinterpretCast'를 사용해야합니다. – Sulthan

+0

@Sulthan 예, 방금 래퍼 작성을 마쳤습니다. 완전히 맞습니다. 나는 애플이 스위프트에서 포인터 연산을 방해하고 싶다고 생각한다. 전체 범주의 오류가 발생하기 때문이다. 코드는 아마도 Swift에서 느리게 실행됩니다. – Charlesism

+1

버퍼를 작성하고 여기에 채우는 유용한 예는 다음과 같습니다. https://gist.github.com/rothomp3/0a7b9fef4249a4f91fc6 – matt

답변

0

첫 번째 질문에 대해 난 그냥 바이트 값의 배열을 만들 것입니다 :

var bytes = Array<UInt8>(count: qty_bytes_in_file, repeatedValue: 0) 

을 그리고 난 당신이에서 아웃 매개 변수로 해당 배열에 대한 참조를 제공 할 수 있다고 생각합니다. 예를 들어 : 사용할 수있는 래퍼 ...

struct UnsafePointer<T> 

은 ...는 "메모리"속성 스위프트도 있습니다

let stream = NSInputStream(data: someNSDataObject) 
let numberOfBytesRead = stream.read(&bytes, maxLength:buffer.count) 

원시 기본 메모리로 얻을 수 있습니다.

+1

내 문제는 약간 다릅니다. 포인터 연산을 할 필요가 있습니다. 예를 들어, malloced 메모리 블록의 세 번째 또는 네 번째 바이트에 대한 참조를 얻으십시오. – Charlesism

관련 문제