Swift:创建具有已定义数量的值的UInt8数组

use*_*691 1 uint8t swift

这怎么可能创建ArrayUInt8斯威夫特?我用以下代码尝试了这个:

var array: [UInt8] = [UInt8]()
Run Code Online (Sandbox Code Playgroud)

现在我想循环第二个UInt变量a:

for var i: Int = 0; i < a.count; i++ {
    array[i] = UInt8(a[i]^b[i])
}
Run Code Online (Sandbox Code Playgroud)

但后来我收到以下错误:

致命错误:数组索引超出范围

当我在变量中放入相同的位a- >时[0x01,0x01,0x01,0x01,0x01],array循环工作正常!

有人知道为什么吗?

Mar*_*n R 8

从 Swift文档中的集合类型:

您不能使用下标语法将新项追加到数组的末尾.

有不同的可能解决方案:

创建具有所需大小的数组,如@Fantattitude所说:

var array = [UInt8](count: a.count, repeatedValue: 0)
for var i = 0; i < a.count; i++ {
    array[i] = UInt8(a[i]^b[i])
}
Run Code Online (Sandbox Code Playgroud)

或者从一个空数组开始并附加元素,就像@Christian刚回答的那样:

var array = [UInt8]()
for var i = 0; i < a.count; i++ {
    array.append(UInt8(a[i]^b[i]))
}
Run Code Online (Sandbox Code Playgroud)

然而,在您的情况下,"swifty"方式将是一种功能性方法,zip()并且map():

// Swift 1.2 (Xcode 6.4):
let array = map(zip(a, b), { $0 ^ $1 })
// Swift 2 (Xcode 7):
let array = zip(a, b).map { $0 ^ $1 }
Run Code Online (Sandbox Code Playgroud)

zip(a, b)返回所有数组元素对的序列(如果两者的较短数组都用完则停止).map() 然后计算每对的XOR并将结果作为数组返回.


Fan*_*ude 5

你可以使用init(count: Int, repeatedValue: Element)Array是这样的:

var array = [UInt8](count: 5, repeatedValue: 0x01)
Run Code Online (Sandbox Code Playgroud)

要了解有关Array初始化器的更多信息,请查看此处:http://swiftdoc.org/swift-2/type/Array/

  • Swift 3:var array = [Uint8](重复:0x01,count:5) (2认同)