【问题标题】:"Cannot Subscript a value of type '[String]' with an index of type 'String' "“不能用'String'类型的索引下标'[String]'类型的值”
【发布时间】:2016-10-08 02:01:01
【问题描述】:

斯威夫特 3.0

收到此错误:“无法使用 'String' 类型的索引为 '[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(实际的数组元素)。 为什么会发生这种情况?

【问题讨论】:

    标签: arrays swift loops


    【解决方案1】:

    在你的第一个循环中,你正在做

    for x in pokemon
    

    这会将pokemon 中的每个值转换为x

    您不需要下标pokemon[x],因为x 不是索引,它元素。

    当然,你会得到你得到的错误,因为: - pokemon 是一个字符串数组 - xpokemon 中的一个元素(这使它成为一个字符串)。

    有了这个循环,这发生在你的代码中:

    pokemon["snorlax"]
    

    由于数组只能被整数下标,这是无效的。

    对于这个循环,一个人只需要

    name = x
    

    pokemon的当前迭代元素的值转换为变量。


    在您的第二个循环中,您正在遍历一个整数序列(范围)。

    for x in 1..<pokemon.count
    

    1..&lt;pokemon.count 范围为 x 提供每次迭代的值 1、2、3... 等等,直到您达到比数组中口袋妖怪的数量少 1。

    这有效,因为您现在将数组 pokemon 下标为整数值 x

    有了这个循环,这发生在你的代码中:

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

    另外,我不确定这是否是您的代码中的错误,但从 1 开始的范围意味着您将排除零索引数组的第一个元素,其中第一个元素是 0。

    【讨论】:

    • 那么它只是“for in”循环的规则,如果我们想要获取元素的索引,我们应该使用“0..“for x in pokemon”? (是的,留下第一个元素是个错误)
    • 是的,你明白了。循环的第一种样式返回元素本身,循环的范围样式返回索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多