일부 코드를 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;
}
나는 obj-c 래퍼를 만들 것이다. 순수한 스위프트에서하는 것은 너무 어려울 것입니다. 그러나 시작점은'UnsafePointer'이며, malloc을 활성화 할 수 있습니다.하지만 알다시피,'reinterpretCast'를 사용해야합니다. –
Sulthan
@Sulthan 예, 방금 래퍼 작성을 마쳤습니다. 완전히 맞습니다. 나는 애플이 스위프트에서 포인터 연산을 방해하고 싶다고 생각한다. 전체 범주의 오류가 발생하기 때문이다. 코드는 아마도 Swift에서 느리게 실행됩니다. – Charlesism
버퍼를 작성하고 여기에 채우는 유용한 예는 다음과 같습니다. https://gist.github.com/rothomp3/0a7b9fef4249a4f91fc6 – matt