bekomme es mit withCString nicht hin

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • bekomme es mit withCString nicht hin

    Hallo,

    ich brauche für eine C-Funktion einer C-Library einen ganz normalen C-String

    C-Quellcode

    1. void function doIt(char* s) {
    2. doSomethingWith(s);
    3. }


    dies klappt mit withCString, wie ich gelernt habe.

    Quellcode

    1. var s = "Beispiel"
    2. s.withCString { ( ptr: UnsafePointer<Int8>) -> Void in
    3. // Do something with ptr
    4. doIt( ptr)
    5. }
    was ich aber nicht hinbekomme, ist es, das Encoding noch zu verändern. es gibt zwar die entsprechenden Funktionen:

    Quellcode

    1. func withCString<Result, TargetEncoding>(encodedAs targetEncoding: TargetEncoding.Type, _ body: (UnsafePointer<TargetEncoding.CodeUnit>) throws -> Result) rethrows -> Result where TargetEncoding : _UnicodeEncoding
    2. func withCString<Result, Encoding>(encodedAs targetEncoding: Encoding.Type, _ body: (UnsafePointer<Encoding.CodeUnit>) throws -> Result) rethrows -> Result where Encoding : _UnicodeEncoding
    aber ich werde aus der Dokumentation nicht schlau und bekomme es nicht hin. Was sollen diese Erklärungen bedeuten?

    Gruß und danke,

    fiveyears
  • Hallo!

    Ich wollte das aus Interesse mal ausprobieren. Klappte leider nicht.

    Quellcode

    1. void function doIt(char* s) {
    2. doSomethingWith(s);
    3. }

    Mit function klappt das bei mir nicht.
    Zudem muss der Parametertyp bei mir const char* sein, damit ich in Swift mit UnsafePointer<Int8> arbeiten kann und nicht
    UnsafeMutablePointer<Int8> erwartet wird, was mit withCString nicht kompatibel ist.
    Folgender Swift-Code läuft bei mir:

    Quellcode

    1. let s = "Beispiel"
    2. let res = s.withCString { (ptr: UnsafePointer<Int8>) -> Result<Any, Error> in
    3. return Result() {
    4. doIt(ptr)
    5. return 1
    6. }
    7. }
    In meiner C-Funktion gebe ich die übergebenen Daten nur mit printf aus.

    Mein Versuch, das mit Encoding zu machen führt zu Fehlermeldungen.

    Quellcode

    1. let res2 = s.withCString(encodedAs: Unicode.UTF16)
    2. {
    3. (ptr: UnsafePointer<Int16>) -> Result<Any, Error> in
    4. return Result() {
    5. doIt3(ptr)
    6. return 1
    7. }
    8. }

    Quellcode

    1. void doIt3(const short* s);
    Fehlermeldung in Zeile 2 des obigen Swiftcodes verstehe ich nicht mehr.

    Quellcode

    1. Cannot convert value of type '(UnsafePointer<Int16>) -> Result<Any, Error>' to expected argument type '(UnsafePointer<_>) -> _'

    Wenn ich es mit UTF8 statt UTF16 und der entsprechenden C-Funktion versuche, bekomme ich fast die gleiche Meldung.
    Offenbar liegt es an den strengen Typsicherheit und den manchmal nicht leicht verständlichen Typen.

    Vielleicht hat jemand anders hier eine Erklärung.