You will need to go via the String
representation of the Character
:s to convert to UInt8
. You needn't, however, explicitly initialize an array in your [Character] -> [UInt8]
conversion; since String.UTF8View
(from String.utf8
) is a CollectionType
, you can apply a map
operation on the String.UTF8View
itself; with an UInt8
initialization. I.e.,
let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
let asUInt8Array = String(charArray).utf8.map{ UInt8($0) }
print(asUInt8Array)
/* [83, 116, 114, 105, 110, 103] */
print(asUInt8Array.dynamicType)
/* Array<UInt8> */
With regard to your comment below ("frustrated over the abstraction of Swift, as compared to the simple ways of Objective-C"): if you believe the above to be messy, you could include it in an extension to SequenceType
constrained to Character
elements, allowing easier use in practice. E.g.:
extension SequenceType where Generator.Element == Character {
/* extension accessible as function */
func asByteArray() -> [UInt8] {
return String(self).utf8.map{UInt8($0)}
}
/* or, as @LeoDabus pointed out below (thanks!),
use a computed property for this simple case */
var byteArray : [UInt8] {
return String(self).utf8.map{UInt8($0)}
}
}
Usage example:
let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
/* use extension function */
let asUInt8Array = charArray.asByteArray()
/* or computed property */
let asUInt8Array = charArray.byteArray