Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift中将字符转换为UInt8_Swift - Fatal编程技术网

如何在Swift中将字符转换为UInt8

如何在Swift中将字符转换为UInt8,swift,Swift,我在swift中有一系列字符: static let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"] 我想对每个字符作为一个字节(UInt8)进行一些位运算。例如,如何将charArray[0]转换为UInt8 var char: Character = "a" var byte: UInt8 = Array(String(char).utf8)[0] 一定有更好的方法…我不知道如何将字符转换为UTF-8,但字符串有一个utf

我在swift中有一系列字符:

static let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]

我想对每个
字符作为一个字节(
UInt8
)进行一些位运算。例如,如何将
charArray[0]
转换为
UInt8

var char: Character = "a"
var byte: UInt8 = Array(String(char).utf8)[0]

一定有更好的方法…

我不知道如何将字符转换为UTF-8,但字符串有一个
utf8
属性,因此您可以使用以下方法:

let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
let string = Array(String(charArray).utf8)
print(string)

您需要通过
字符
:s的
字符串
表示来转换为
UInt8
。但是,您不需要在
[Character]->[UInt8]
转换中显式初始化数组;由于
String.utf8视图
(来自
String.utf8
)是
集合类型
,因此可以对
String.utf8视图
本身应用
映射
操作;使用
UInt8
初始化。即

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> */
用法示例:

let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]

/* use extension function */
let asUInt8Array = charArray.asByteArray()

/* or computed property */
let asUInt8Array = charArray.byteArray
改善@dfri答案

对于Swift 3您必须使用以下选项:

extension Sequence where Iterator.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)}
    }
}

这是一个可行的想法,一定有更好的方法。你知道一个字符可能不止一个UTF-8字节?UInt8只是8位。这不能容纳大多数角色。限制使用US-ASCII适合您的用例?@Leo Dabus这不是一个副本,因为我试图转换的是字符而不是字符串。@Thilo是的,很好,只是字母表中的字母。字符串只是一个字符序列。如果您想要更合适的副本,我可以重新打开它:这让Swift的抽象程度令人沮丧。这在Objective-C中非常简单。@JBaczuk我不太熟悉Obj-C,但一般来说,作为一种注重“安全”的语言,与不太安全但可能(在某些情况下)更通用的语言w.r.t.相比,一些“限制”最终会进入到语言中。然而,使用SWIFT多功能性允许扩展本地类型,您可以轻松地创建自己的包装器,以简化您所考虑的非简单代码。作为一个例子,我将使用
生成器的
SequenceType
扩展来添加上述解决方案的一个版本。元素
:s约束为
字符
类型。这将使它更简单。当然,好的答案仅限于Swift。对于某些事情,它只是“swift”。@dfri在扩展任何方法时,如果您只需要传递给该方法的元素本身,您可以使用计算属性,例如
var bytesArray:[UInt8]{return…}
@LeoDabus您是对的,因为我们没有进行任何抛出操作,所以上面的计算属性更适合,谢谢!(不在移动设备上时,将包括在回答中)。
extension Sequence where Iterator.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)}
    }
}