我在Objective-C
中有一个定义如下的方法:
- (BOOL)dataHandler:(void*)buffer length:(UInt32)length
在ObjC中,我们将此方法称为:
self [self dataHandler:(void*)[myNsString UTF8String] length:[myNsString length]];
当我看到Swift的原型时,就会出现这样的结果:
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!))
还有什么我没试过的吗?我在下面看到了这个:
答案 0 :(得分:3)
与UnsafeMutablePointer<Int8> from String in Swift类似,您可以将响应字符串作为UTF-8编码的字节发送 使用
处理方法response.withCString {
self.dataHandler(UnsafeMutablePointer($0), length: UInt32(strlen($0)))
}
在块中,$0
是一个指向NUL终止的char
数组的指针,其中包含字符串的UTF-8表示。
另请注意您的Objective-C代码
[self dataHandler:(void*)[myNsString UTF8String] length:[myNsString length]]
存在潜在问题:length
返回UTF-16代码的数量
字符串中的点,而不是UTF-8字节的数量。所以这
不会为具有非ASCII字符的字符串传递正确的字节数。