web-dev-qa-db-fra.com

Méthode Swift 3 pour créer des données encodées en utf8 à partir de String

Je sais qu'il y a beaucoup de questions pré-Swift3 sur NSData. Je suis curieux de savoir comment passer d'un objet Swift3 String à un objet utf8 codé (avec ou sans terminaison nulle) en objet Swift3 Data.

Le meilleur que j'ai trouvé jusqu'ici est:

let input = "Hello World"
let terminatedData = Data(bytes: Array(input.nulTerminatedUTF8))
let unterminatedData = Data(bytes: Array(input.utf8))

Devoir faire la construction Array() intermédiaire semble mal.

23
Travis Griggs

C'est simple:

let input = "Hello World"
let data = input.data(using: .utf8)!

Si vous voulez mettre fin à data avec null, il suffit simplement que append donne un 0. Ou vous pouvez appeler cString(using:)

let cString = input.cString(using: .utf8)! // null-terminated
57
Code Different

Les méthodes NSString du cadre NSFoundation doivent être supprimées au profit des équivalents de Swift Standard Library. Les données peuvent être initialisées avec n’importe quelle variable Sequence dont les éléments sont UInt8. String.UTF8View satisfait à cette exigence.

let input = "Hello World"
let data = Data(input.utf8)
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

La terminaison null de chaîne est un détail de la mise en œuvre du langage C et ne doit pas fuir à l'extérieur. Si vous prévoyez de travailler avec des API C, consultez la propriété utf8CString de String type:

public var utf8CString: ContiguousArray<CChar> { get }

Data peut être obtenu après la conversion de CChar en UInt8:

let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8($0) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]
2
Wojciech Nagrodzki