Swift CollectionType索引行为
如果绑定从一种集合类型计算的索引,例如Swift CollectionType索引行为,swift,Swift,如果绑定从一种集合类型计算的索引,例如字符串,似乎可以将该索引重新用于其他集合。例如: var str1 = "Hello, World!" var dex1 = str1.startIndex var str2 = "Goodbye, All!" str2[dex1] => "G" 如果把这个String.Index看作一个整数偏移量(进入数组),这就有一定的意义;然而,作为整数的索引远远不是必需的。然而,许多/所有内置的Swift集合类型:Array、Dictionary、Set
字符串
,似乎可以将该索引重新用于其他集合。例如:
var str1 = "Hello, World!"
var dex1 = str1.startIndex
var str2 = "Goodbye, All!"
str2[dex1] => "G"
如果把这个String.Index
看作一个整数偏移量(进入数组),这就有一定的意义;然而,作为整数的索引远远不是必需的。然而,许多/所有内置的Swift集合类型:Array
、Dictionary
、Set
和String
都有这些“可重用”索引
是否将这种跨集合类型的“重用”视为一种需求?我在任何文档中都没有注意到这一点;我忽略了吗
在上面的代码示例中,我期望:
> str2[dex1]
Exception: dex1 is not an index of str2
[字符串只是一个示例;请参见粗体问题]答案是,从苹果论坛总结:观察到的行为:
- 这不是一项要求
- 不应依赖
- 对于值类型,可能很难抛出异常
str1.startIndex
是一个String.Index
。好的,所以您可以在任何可用String.Index
的地方使用它。订阅字符串是它可用的地方之一。等等它与任何东西都不“绑定”,这是一个关于索引要求的一般性问题。如果我创建了一个包含父/子节点的树类型,并将索引建立在遍历节点的基础上。。。那么一棵树中的根节点/索引在另一棵树中就不可用了。为什么它不可用呢?一种类型就是一种类型。你的“不是str2的索引”只是你无缘无故地编造的东西。它可能超出范围,但仍然是正确类型的值。为一个字符串创建的范围(和索引)不能可靠地用于其他字符串,请参见。@MartinR I没有说它是可靠的。我说它是可用的,也就是说,在语法上是合法的。当然,这会崩溃:“x”[advance(“hello.startIndex,1)]
,但这并不违法,也没什么奇怪的。这是一件愚蠢的事情,但是String.Index
的本质并没有让你惊讶的地方。我注意到他们发现在一种情况下会抛出一个异常,在这种情况下,你使用endIndex
作为下标,或者试图积极地超越它,所以很明显,它是以一种特殊的方式标记的。但除此之外,这肯定与我们在评论中得到的一致,也就是说,这并不令人惊讶,但不要这样做。