【发布时间】:2018-02-08 11:16:15
【问题描述】:
我正在为 libxml2 C 库开发 Swift 3 包装器。
有两种方便的方法可以将String 转换为UnsafePointer<xmlChar>,反之亦然。在 libxml2 中,xmlChar 被声明为 unsigned char。
-
UnsafePointer<xmlChar>到String并不复杂func stringFrom(xmlchar: UnsafePointer<xmlChar>) -> String { let string = xmlchar.withMemoryRebound(to: CChar.self, capacity: 1) { return String(validatingUTF8: $0) } return string ?? "" } -
例如,对于
String到UnsafePointer<xmlChar>,我尝试了很多方法let bytes = string.utf8CString.map{ xmlChar($0) } return UnsafePointer<xmlChar>(bytes)但这不起作用,我想出的唯一可行的解决方案是
func xmlCharFrom(string: String) -> UnsafePointer<xmlChar> { let pointer = (string as NSString).utf8String return unsafeBitCast(pointer, to: UnsafePointer<xmlChar>.self) }
有没有更好的,swiftier 的方法,无需将桥转换为 NSString 和 unsafeBitCast?
【问题讨论】:
-
您的
stringFrom(xmlchar:)方法未正确实现,capacity:应该是您接收的缓冲区的长度,不一定是 1。我会改为使用String.decodeCString(xmlchar, as: UTF8.self, repairingInvalidCodeUnits: false)?.result ?? ""。您对xmlCharFrom的实现都不正确;你试图逃避你不能控制生命周期的指针,在这两种情况下你都会得到未定义的行为。
标签: swift swift3 libxml2 unsafe-pointers