2016-09-16 2 views
3

Ich habe eine capi, die eine nullterminierte Zeichenkette zurückgibt, die ein Array vom Typ unsigned char* ist (was UnsafePointer<UInt8> entsprechen würde).Swift 3: konvertiere einen unsafe-terminierten UnafePointer <UInt8> in eine Zeichenkette

Swift hat den Initialisierer String(validatingUTF8:), aber das Argument hat UnsafePointer<CChar> (a.k.a. UnsafePointer<Int8>) sein, und es gibt keine triviale Weise zwischen den beiden umzuwandeln.

Wie konvertiere ich von dieser nullterminierten C-Zeichenfolge in eine Swift-Zeichenfolge?

Antwort

8

In Swift 3, String hat zwei Initialisierungen

public init(cString: UnsafePointer<CChar>) 
public init(cString: UnsafePointer<UInt8>) 

daher kann es aus (null-terminierte) Sequenzen von beiden und ohne Vorzeichen Zeichen erstellt werden. Also

let s = String(cString: yourCharPointer) 

sollte einfach funktionieren.


String hat eine andere Initialisierer

public init?(validatingUTF8 cString: UnsafePointer<CChar>) 

die auf schlecht gebildet UTF-8-Sequenzen statt sie zu ersetzen durch die Ersatzzeichen ausfällt. Diese Init-Methode hat kein Gegenstück vorzeichenlose Zeichen.

die bestehenden Implementierungen in CString.swift als Beispiele nehmen, ist es nicht allzu schwierig, dies als eine Erweiterung hinzuzufügen:

extension String { 
    public init?(validatingUTF8 cString: UnsafePointer<UInt8>) { 
     guard let (s, _) = String.decodeCString(cString, as: UTF8.self, 
               repairingInvalidCodeUnits: false) else { 
      return nil 
     } 
     self = s 
    } 
} 

und dann

if let s = String(validatingUTF8: yourCharPointer) { 
    print(s) 
} else { 
    print("invalid UTF-8") 
} 

arbeitet auch mit (nullterminierte) -Sequenzen von sowohl signierten als auch nicht signierten Zeichen.

+0

Verstanden. Es erschien nicht in meiner automatischen Vervollständigung. – AthanasiusOfAlex

Verwandte Themen