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>to Stringuncomplicated

    func 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 example

    let 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?

+4
source share
3 answers

, , - 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!) }
    }
}
+3

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 ...

, , ARC.

+1

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)) }
    }
}
+1

Source: https://habr.com/ru/post/1684765/


All Articles