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