2015-08-07 2 views
0

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

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

Теперь я хочу петлю через вторую UInt переменной a:

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

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

fatal error: Array index out of range

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

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

+0

Какая переменная b? – Neo42

ответ

6

От Collection Types в Swift документации:

You can’t use subscript syntax to append a new item to the end of an array.

Существуют различные возможные решения:

Создайте массив нужного размера, как сказал @Fantattitude:

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

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

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

"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 } 

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

+0

Действительно отличное использование карты + zip здесь.Один лайнер настолько красив;) – Fantattitude

+0

Как добиться этого с помощью двумерного массива, подобного этому (Java Code) byte [] [] tmp = новый байт [2 * (4 + 1)] [4]; – user3143691

+0

@ user3143691: Я предлагаю вам начать * новый вопрос *, который включает всю соответствующую информацию, например. как вы определили 2d массивы a, b в Swift. –

4

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

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

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

+2

Swift 3: var array = [Uint8] (повторение: 0x01, count: 5) – HalR

+1

@HalR: должно быть [UInt8] not [Uint8] – NDB

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^