gpt4 book ai didi

objective-c - 如何从 Swift 将 const void *bytes 传递给 Objective-C block

转载 作者:可可西里 更新时间:2023-11-01 02:19:36 24 4
gpt4 key购买 nike

我正在编写一些调用 Objective-C 库的 Swift (1.2) 代码(转录一些早期的 Objective-C 代码)。目前尚不清楚它应该如何工作。我尝试了很多变体,但没有一个能满足编译器的要求。这是我开始使用的 Objective-C 代码:

// Objective-C

NSData *fileData = //

const void *bytes = fileData.bytes;
unsigned int bufferSize = 1024; //Arbitrary

[object writeDataWithBlock:
^BOOL(BOOL(^writeData)(const void *bytes, unsigned int length), NSError**(actionError)) {
for (NSUInteger offset = 0; offset <= fileData.length; offset += bufferSize) {
unsigned int size = (unsigned int)MIN(fileData.length - i, bufferSize);
writeData(&bytes[i], size);
}

return YES;
}];

到目前为止,我已经了解了这段 Swift 代码:

// Swift

let fileData = //

let ptr = UnsafePointer<UInt8>(fileData.bytes)
let bufferSize = 1024 // Arbitrary

object.writeDataWithBlock() { (writeData, actionError) -> Bool in
for var offset = 0; offset <= fileData.length; offset += bufferSize {
let size = CUnsignedInt(min(fileData.length - offset, bufferSize))
writeData(UnsafePointer<Void>(ptr[offset]), size)
}

return true
}

这给了我这个错误:

Cannot find an initializer for type 'UnsafePointer' that accepts an arguments list of type '(UInt8)'

当我删除 UnsafePointer<Void>转换做更直接的翻译,产生这一行:

writeData(&ptr[offset], size)

我得到这个错误,指向 &字符:

Type of expression is ambiguous without more context

没有 & , 它产生一个 UInt8 ,给我这个错误:

Cannot invoke 'writeData' with an argument list of type '(Uint8, UInt32)'

我需要做什么才能从 NSData 中读取字节?按顺序将它们传递给另一个方法?

最佳答案

指针算法应该(并且确实)能为您提供所需的结果。

let fileData = //
let bufferSize = 1024 // Arbitrary

object.writeDataWithBlock() { (writeData, actionError) -> Bool in
for var offset = 0; offset <= fileData.length; offset += bufferSize {
let size = CUnsignedInt(min(fileData.length - offset, bufferSize))
writeData(fileData.bytes + offset, size)
}

return true
}

关于objective-c - 如何从 Swift 将 const void *bytes 传递给 Objective-C block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com