Faster way to convert String to UnsafePointer <xmlChar> in Swift 3 (libxml2)
I am working on a Swift 3 wrapper for libxml2 C-library.
There are two convenience methods for converting Stringto UnsafePointer<xmlChar>and vice versa. In libxml2, xmlChardeclared as unsigned char.
UnsafePointer<xmlChar>toStringuncomplicatedfunc stringFrom(xmlchar: UnsafePointer<xmlChar>) -> String { let string = xmlchar.withMemoryRebound(to: CChar.self, capacity: 1) { return String(validatingUTF8: $0) } return string ?? "" }For
String-UnsafePointer<xmlChar>I have tried many things, for examplelet bytes = string.utf8CString.map{ xmlChar($0) } return UnsafePointer<xmlChar>(bytes)but this will not work, the only working solution I figured out is
func xmlCharFrom(string: String) -> UnsafePointer<xmlChar> { let pointer = (string as NSString).utf8String return unsafeBitCast(pointer, to: UnsafePointer<xmlChar>.self) }
Is there a better, faster way without tying the bridge to NSStringand unsafeBitCast?
, , - bitPattern::
let xmlstr = str.utf8CString.map { xmlChar(bitPattern: $0) }
Array of xmlChar s. Array withUnsafeBufferPointer, UnsafePointer:
xmlstr.withUnsafeBufferPointer { someAPIThatWantsAPointer($0.baseAddress!) }
UnsafePointer , .
EDIT: ? , , .
func withXmlString<T>(from string: String, handler: (UnsafePointer<xmlChar>) throws -> T) rethrows -> T {
let xmlstr = string.utf8CString.map { xmlChar(bitPattern: $0) }
return try xmlstr.withUnsafeBufferPointer { try handler($0.baseAddress!) }
}
, String:
extension String {
func withXmlString<T>(handler: (UnsafePointer<xmlChar>) throws -> T) rethrows -> T {
let xmlstr = self.utf8CString.map { xmlChar(bitPattern: $0) }
return try xmlstr.withUnsafeBufferPointer { try handler($0.baseAddress!) }
}
}
Swift 3 libxml2.
.
[...] UnsafePointer []
. , , xmlChar.
[...] , ,
let pointer = (string as NSString).utf8String
- -[NSString utf8String]:
Apple docs:
C , , , , , .
, , , , ARC utf8String. .
, [...]?
, . , xmlChar.
API , ( , libxml2 ).
, , :
extension String {
func withXmlChar(block: (UnsafePointer<xmlChar>) -> ()) { ... }
}
, . , - -, Data ARC ...
String
public init(cString: UnsafePointer<UInt8>)
XML Swift
let xmlString: UnsafePointer<xmlChar> = ...
let s = String(cString: xmlString)
UTF-8 Unicode
U+FFFD.
Swift XML-
a , Charles Srstka,
String.withCString
:
extension String {
func withXmlString<T>(handler: (UnsafePointer<xmlChar>) throws -> T) rethrows -> T {
return try self.withCString { try handler(UnsafeRawPointer($0).assumingMemoryBound(to: UInt8.self)) }
}
}
throwing ,
extension String {
func withXmlString<T>(handler: (UnsafePointer<xmlChar>) -> T) -> T {
return self.withCString { handler(UnsafeRawPointer($0).assumingMemoryBound(to: UInt8.self)) }
}
}