2016-10-08 5 views
1

スウィフト3.0「は 『文字列』タイプのインデックスを持つ 『[文字列]』型の値を添字できない」

はこのエラーを得ました型 '文字列' 文字列のポケモン ""私は配列をループしてみました

":しかし

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 

をやっているこれはxからpokemonの各値をキャストします。

pokemon[x]のようにxはインデックスではないため、です。 pokemon文字列 の配列です - - x(その文字列にする)pokemonの要素である は:

当然、あなたはので、あなたが得たエラーはなるだろう。このループでは

、これはあなたのコード内で起こっている:

pokemon["snorlax"] 

配列は、整数のみで添字化されているように、これは無効です。このループのため

、一つだけの変数にpokemonの現在の反復要素の値をキャストする

name = x 

する必要があります。


2番目のループでは、整数シーケンス(範囲)を反復処理しています。

for x in 1..<pokemon.count 

範囲1..<pokemon.countは1、2、3の値をx与える...とそうで反復ごとに、あなたは、アレイ内のポケモンの数より少ない1に達するまで。

これは、配列pokemonの添字がxの整数値になっているためです。このループでは

、これはあなたのコード内で起こっていることは:

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

また、私はこれはあなたのコードに誤りであるのかはわからないが、1で範囲を開始すると、あなたは」ことを意味し最初の要素が0であるゼロインデックス配列の最初の要素を除外します。

+0

"for in"ループのルールです。要素のインデックスを取得する場合は、 "0 .. "for x in pokemon"? (はい、それは最初の要素を残して間違っていた) –

+0

はい、それを持っています。ループの最初のスタイルは要素自体を返し、ループの範囲スタイルはインデックスを返します。 – perhapsmaybeharry

関連する問題