Swift: создание массива UInt8 с определенным количеством значений

Как можно создать Array из UInt8 в Свифте? Я пробовал это с помощью следующего кода:

var array: [UInt8] = [UInt8]()

Теперь я хочу перебрать второй UInt переменная a:

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

Но тогда я получаю следующую ошибку:

фатальная ошибка: индекс массива вне диапазона

Когда я ставлю те же биты, что и a -> [0x01,0x01,0x01,0x01,0x01] в переменной array тогда цикл работает нормально!

Кто-нибудь знает почему?

4 ответа

Решение

Из типов коллекций в документации 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])
}

Или начните с пустого массива и добавьте элементы, как @Christian только что ответил:

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

Однако "быстрый" способ в вашем случае был бы функциональным 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 }

zip(a, b) возвращает последовательность всех пар элементов массива (и останавливается, если более короткий массив обоих исчерпан). map()затем вычисляет XOR каждой пары и возвращает результаты в виде массива.

Вы могли бы использовать init(count: Int, repeatedValue: Element) из Array как это:

var array = [UInt8](count: 5, repeatedValue: 0x01)

Чтобы узнать больше об инициализаторах Array, посмотрите здесь: http://swiftdoc.org/swift-2/type/Array/

Вы можете инициализировать массив, используя счетчик вашего второго массива, чтобы не выводить индекс из-за ошибки диапазона.

var array = [UInt8](count: a.count, repeatedValue: 0x00)

или вы можете использовать метод добавления массива в вашем цикле.

for var i:Int = 0; i < a.count; i++
{
   array.append( UInt8(a[i]^b[i]) )
}

На Swift 3 и далее:

      var array = [UInt8](repeating: 0, count: 30)
Другие вопросы по тегам