Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift CollectionType索引行为_Swift - Fatal编程技术网

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
作为下标,或者试图积极地超越它,所以很明显,它是以一种特殊的方式标记的。但除此之外,这肯定与我们在评论中得到的一致,也就是说,这并不令人惊讶,但不要这样做。