来自Swift

时间:2015-09-16 18:54:04

标签: objective-c swift

我在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!))

还有什么我没试过的吗?我在下面看到了这个:

Get the length of a String

UnsafeMutablePointer<Int8> from String in Swift

1 个答案:

答案 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字符的字符串传递正确的字节数。