-1

Я новичок в быстрой работе и пытаюсь настроить 10x10 2D-массив Bools, где один из трех является истинным, а остальные являются ложными. По какой-то причине это не будет работать, вместо этого, дав мне длинную ошибку по причине: EXC_BAD_INSTRUCTION. Может кто-нибудь, пожалуйста, помогите мне выяснить, что я делаю неправильно. Благодаря!Неустранимая ошибка: Индекс вне диапазона ... Почему этот код не компилируется?

var before = [[Bool]]() 

for x in 0..<10 { 
for y in 0..<10 { 
    if arc4random_uniform(3) == 1 { 
     before[x][y] = true 
    } 
    else { 
     before[x][y] = false 
    } 
} 
} 
+2

Ваш массив пуст. В индексе 'x' ничего нет. – emlai

+1

Возможный дубликат [Ошибка: «индекс массива вне диапазона» в многомерном массиве] (http://stackoverflow.com/questions/32650268/error-array-index-out-of-range-in-multidimensional-array) – Hamish

+0

Ответили ниже ответы на ваш вопрос? –

ответ

1

Это похоже на то, что вы инициализируете объект 'before' как массив, а затем присваиваете ему как словарь. (Также, как вы назначаете это выглядит, как он может сделать с подстройке.

[Bool] = Массив BOOLS [[Bool]] = Массив Массив BOOLS

присвоить выше вам нужно . создать [Bool] массив с вашим результатом, и добавить его к вышеуказанному объекту

так как кажется, что вы хотите использовать до того, как словарь, то вы можете просто изменить Инициализатор быть:

var before = [Int:[Int:Bool]]() 

и смените вашу функцию:

for x in 0..<10 { 
    for y in 0..<10 { 
     let test = x 
     if arc4random_uniform(3) == 1 { 
      before[x] = [y:true] 
     } 
     else { 
      before[x] = [y:false] 
     } 
    } 
} 

Тогда вы успешно сможете вызвать значения с помощью

//To call before[1][3] 
if let before = before[1] { 
    print(before[3]) 
} 

Если я не прав, и вы хотите, чтобы работать как массив Массив BOOLS, то вам необходимо изменить, как вы добавить свои результаты «до» массива:

  1. Во-первых Генерировать «значение X» массив BOOLS
  2. Append это Bool массив на «до» массива

var before = [[Bool]]()

for x in 0..<10 { 
    var yArray = [Bool]() 
    for y in 0..<10 { 
     if arc4random_uniform(3) == 1 { 
      yArray.append(true) // Array of Bools 
     } 
     else { 
      yArray.append(false) 
     } 
    } 
    before.append(yArray) 

} 
//To call before[1][3] 
print(before[1][3]) 
2

Вы получаете фатальную ошибку: индекс вне диапазона, потому что вы можете не индексировать в пустой массив в Swift (потому что даже индекс массива 0 еще не существует).

Одним из решений является инициализация двухмерного массива с помощью инициализаторов вложенных массивов. Если вы инициализировать его всем false, то вы только должны установить true значения:

var before = [[Bool]](count: 10, repeatedValue: [Bool](count: 10, repeatedValue: false)) 

for x in 0..<10 { 
    for y in 0..<10 { 
     if arc4random_uniform(3) == 1 { 
      before[x][y] = true 
     } 
    } 
}