我在 Objective-C
中定义了如下方法:
- (BOOL)dataHandler:(void*)buffer length:(UInt32)length
在 ObjC 中我们这样调用这个方法:
self [self dataHandler:(void*)[myNsString UTF8String] length:[myNsString length]];
当我看到 Swift 的原型(prototype)时,它是这样的:
self.dataHandler(<#buffer: UnsafeMutablePointer<Void>#>, length: <#UInt32#>)
我正在按照以下方式尝试,但无法使其正常工作:
self.dataHandler(buffer: UnsafeMutablePointer(response!), length: count(response!))
我也试过:
var valueToSend = UnsafeMutablePointer<Void>(Unmanaged<NSString>.passRetained(response!).toOpaque())
self.dataHandler(buffer: valueToSend, length: count(response!))
还有什么我没试过的吗?我阅读了以下内容:
最佳答案
类似于UnsafeMutablePointer<Int8> from String in Swift ,您可以将响应字符串作为 UTF-8 编码字节发送 到处理程序方法
response.withCString {
self.dataHandler(UnsafeMutablePointer($0), length: UInt32(strlen($0)))
}
在 block 内,$0
是一个指向以 NUL 结尾的 char
数组的指针,该数组具有字符串的 UTF-8 表示。
另请注意您的 Objective-C 代码
[self dataHandler:(void*)[myNsString UTF8String] length:[myNsString length]]
有一个潜在的问题:length
返回的是UTF-16编码的个数
点在字符串中,而不是 UTF-8 字节数。所以这
不会为具有非 ASCII 字符的字符串传递正确的字节数。
关于objective-c - UnsafeMutablePointer 从 Swift 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32616529/