objective-c - UnsafeMutablePointer 从 Swift 调用函数

标签 objective-c swift

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

还有什么我没试过的吗?我阅读了以下内容:

Get the length of a String

UnsafeMutablePointer<Int8> from String in Swift

最佳答案

类似于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/

相关文章:

objective-c - 将 NSDictionary 写入 NSPasteboard

Objective-C:检查 OSX 中的防火墙状态?

ios - 如何为 BarButtonItem 设置唯一 ID

swift - 无法设置 UIImageView 的大小

ios - 绑定(bind) UITextField 来查看模型变量

objective-c - 如何识别 Cocoa 应用程序中拖动操作的源窗口

objective-c - Swift NSData 初始化器

ios - "From View Controller"使用 UIViewControllerContextTransitioning 消失

ios - 在应用程序终止之前存储(持久化)结构数组的最有效方法是什么?

swift - 如何计算两个 AnchorEntities 之间的距离?