我很好奇,为什么这段代码可以正常工作而没有任何错误:

let a = [1]
print(a.index(after: a.endIndex)) // 2

但是,如果我们尝试使用String类型重复此代码,则会收到错误消息:
let s = "a"
print(s.index(after: s.endIndex)) // Fatal error: Can't advance past endIndex

根据 Collection String 文档,它们都有相同的声明:



是一个错误还是一切正常了?我正在使用Swift 4.2。

最佳答案

如果转到Arraysource code,我们可以找到:

public func index(after i: Int) -> Int {
    // NOTE: this is a manual specialization of index movement for a Strideable
    // index that is required for Array performance.  The optimizer is not
    // capable of creating partial specializations yet.
    // NOTE: Range checks are not performed here, because it is done later by
    // the subscript function.
    return i + 1
}

在这种情况下,我们可以这样重写代码,最后导致崩溃:
let a = [1]
let index = a.index(after: a.endIndex)
print(a[index])

因此,所有操作对于Array类型都是“按预期的”,但是如果我们不想在运行时崩溃,我们必须自己检查结果index
P.S. @ MartinR的有用链接:https://forums.swift.org/t/behaviour-of-collection-index-limitedby/19083/3

关于swift - 索引的不同行为(在:) in Collection and String之后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55128792/

10-08 22:42
查看更多