【问题标题】:UnsafeMutablePointer calling function from Swift来自 Swift 的 UnsafeMutablePointer 调用函数
【发布时间】:2015-09-16 18:54:03
【问题描述】:

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

【问题讨论】:

  • response有什么类型?
  • 这是 Swift 中的 String

标签: objective-c swift


【解决方案1】:

类似于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 字符的字符串传递正确的字节数。

【讨论】:

  • 你能解释一下它的作用吗?还有为什么一定要response.withCString { },为什么不能直接调用dataHandler
  • @KVISH:查看更新。您不能直接调用它,因为 String 不是 C 字符串,而是包含指向字符串表示形式的指针的结构。
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多