2014-11-26 2 views
0

Я соединил следующий код:Используя массив значений для инициализации новых элементов массива

let tings = [1, 2, 4, 5, 6, 8] 

class Foo { 
    var number: Int 
    init(something: Int) { 
     self.number = something 
    } 
} 

var list: [Foo] = [] 
for num in tings { 
    var temp = Foo(something: tings[num])   //excbadinstruction invop 
    list.append(Foo(something: 3))    //no error 
    list.append(Foo(something: Int(4)))   //no error 
    list.append(Foo(something: tings[num]))  //excbadinstruction invop 
    list.append(Foo(something: Int(tings[num]))) //excbadinstruction invop 
} 

Я не получить то, что проблема с последними двумя линиями, как на мой взгляд вещи [число] также типа Int, и, конечно же, с последней строкой.

Если я укажу, что тип вещей будет [Int], ничего не меняется (что не странно для меня) Я также должен явно указать «что-то», чего я не ожидал, потому что это был первый и единственный аргумент инициализатора.

Я надеюсь, что кто-нибудь сможет объяснить это мне и/или дать правильный путь для этого.

+0

«Int» - это «структура» на языке Swift, и вы не можете индексировать с помощью struct. – gagarwal

+0

'tings' является' [Int] '... не' Int'. Он подписывает массив. – nhgrif

+0

@nhgrif no, tings - [Int], однако tings [num] - это Int – Simon

ответ

2

Swift Playground - забава и все, но это довольно ужасно, когда дело доходит до отладки.

Если мы дублируем этот код в реальном компилируемом и сборщиком приложении, мы не получаем предупреждений или ошибок времени сборки. Однако, как только мы нажимаем на игру и запускаем код, проблема очевидна. Консольные отпечатки:

fatal error: Array index out of bounds 

В этом проблема ... наш массив состоит из шести элементов. Это означает, что максимальный доступный индекс 5.

Посмотрите на нашем цикле:

for num in tings { 
    // do stuff 
} 

Если изменить цикл для печати num, как это:

for num in tings { 
    println(num) 
} 

Вы увидите, что это печатает наш tings массив:

1 
2 
4 
5 
6 
8 

Теперь давайте доступ к элементу в каждый индекс:

for num in tings { 
    println(tings[num]) 
} 

Какие принты?

2 
4 
6 
8 
fatal error: Array index out of range 

Что случилось?

Мы попытались получить доступ к 6-му индексу, поскольку пятая итерация цикла, пятого элемента массива, представляет собой Int 6. Мы пытаемся получить доступ к 6-му элементу, который выходит за рамки для нашего массива ,


Если вы пытаетесь повторению элементов tings и экземпляр Foo для каждого элемента, вам просто нужно это:

for num in tings { 
    list.append(Foo(something: num)) 
} 

Или, как Павел указывает на комментарий, если вы нужен индекс, вы можете перебирать петлю как таковой:

for (index, value) in enumerate(tings) { 
    // do stuff 
} 
+0

И если вы хотите индексы: для (индекс, значение) в перечислении (tings) { –

+0

Спасибо, с учетом вашего объяснения, я снова прочитал раздел в Apples swift guide about for in in loops и теперь его ясный мне. Большое спасибо! – Simon

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