2016-10-08 2 views
1

Swift 3,0«Невозможно Нижний индекс значение типа„[Строка]“с индексом типа" Строка»

получил эту ошибку:«Невозможно Subscript значение типа „[String]“ с индексом Тип "Строка"

, когда я попытался перебрать массив "покемон" строки:

for x in pokemon { 

    var name: String! 
    name = pokemon[x] 

    poke = Pokemon(name: name, pokemonId: x) 

    pokemons.append(poke) 
} 

Однако он работал, когда я писал:

for x in 1..<pokemon.count { 

    var name: String! 
    name = pokemon[x] 
    poke = Pokemon(name: name, pokemonId: x) 
    pokemons.append(poke) 
} 

После исследования кажется, что «for x in pokemon» делает «x» не Int, а String (фактические элементы массива). Почему это происходит?

ответ

1

В своем первом цикле, вы делаете

for x in pokemon 

Это ставит под каждое значение в pokemon к x.

Вам не нужно индексировать pokemon[x], как x не является индексом, он является элемент.

Естественно, вы получите сообщение об ошибке вы получили, потому что: - pokemon массив строк - x является элементом в pokemon (что делает его строку).

С помощью этого цикла, это происходит в вашем коде:

pokemon["snorlax"] 

В массивах subscriptable только целым числом, это является недопустимым.

Для этого цикла, нужно только

name = x 

бросить значение в настоящее время повторного элемента pokemon к переменной.


В вашей второй петле вы повторяете целую последовательность (диапазон).

for x in 1..<pokemon.count 

Диапазон 1..<pokemon.count дает x значение 1, 2, 3 ... и так далее на одной итерации, пока не достигнет одного меньше, чем кол-Покемонов в массиве.

Это работает, потому что теперь вы подписываете массив pokemon на целое значение x.

С помощью этого цикла, это происходит в вашем коде:

pokemon[1] // contains string "snorlax"` 

Кроме того, я не уверен, если это ошибка в коде, но начиная с диапазона на 1 означает, что вы» ll исключает первый элемент массива с нулевой индексацией, в котором первый элемент равен 0.

+0

Так это просто правило цикла «for in», что если мы хотим получить индекс элементов, мы должны использовать «0 .. «для x в покемоне»? (Да, это была ошибка, оставив первый элемент) –

+0

Да, вы поняли. Первый стиль цикла возвращает сами элементы, а стиль диапазона цикла возвращает индексы. – perhapsmaybeharry

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