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)