首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SubSequence指数的相容性

SubSequence指数的相容性
EN

Stack Overflow用户
提问于 2016-10-23 11:58:36
回答 1查看 229关注 0票数 0

对于大多数Swift CollectionsCollection's SubSequence的索引与基本Collection兼容。

代码语言:javascript
复制
func foo<T: Collection>(_ buffer: T) -> T.Iterator.Element
    where T.Index == T.SubSequence.Index
{
    let start = buffer.index(buffer.startIndex, offsetBy: 2)
    let end = buffer.index(buffer.startIndex, offsetBy: 3)
    let sub = buffer[start ... end]
    return buffer[sub.startIndex]
}

这对于大多数收藏品来说都很好:

代码语言:javascript
复制
print(foo([0, 1, 2, 3, 4])) // 2

甚至对String.UTF8View来说

代码语言:javascript
复制
print(foo("01234".utf8) - 0x30 /* ASCII 0 */) // 2

但是当使用String.CharacterView的时候,事情就开始崩溃了:

代码语言:javascript
复制
print(foo("01234".characters)) // "0"

对于CharacterView,SubSequences创建完全独立的实例,即索引再次从0开始。要将其转换回主字符串索引,必须使用distance函数并将其添加到主String中的SubSequencestartIndex中。

代码语言:javascript
复制
func foo<T: Collection>(_ buffer: T) -> T.Iterator.Element
    where T.Index == T.SubSequence.Index, T.SubSequence: Collection, T.SubSequence.IndexDistance == T.IndexDistance
{
    let start = buffer.index(buffer.startIndex, offsetBy: 2)
    let end = buffer.index(buffer.startIndex, offsetBy: 3)
    let sub = buffer[start ... end]

    let subIndex = sub.startIndex
    let distance = sub.distance(from: sub.startIndex, to: subIndex)
    let bufferIndex = buffer.index(start, offsetBy: distance)
    return buffer[bufferIndex]
}

这样,所有三个示例现在都正确地打印了2。

  • 为什么字符串SubSequence索引与它们的基字符串不兼容?只要一切都是不可变的,我就不明白为什么String是一个特例,即使所有Unicode的东西都是如此。我还注意到子字符串函数返回String,而不是像大多数其他集合那样返回片。但是,在O(1)中仍然记录了子字符串是返回的。奇怪的魔法。
  • 是否有一种方法来约束泛型函数,以将其限制为SubSequence索引与基本序列兼容的集合?
  • 人们甚至可以假设SubSequence索引对非字符串集合是兼容的,还是这只是巧合,而且应该始终使用distance(from:to:)来转换索引?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-23 13:02:06

这是论快速进化,作为bug报告SR-1927 -字符串视图的子序列行为不正确文件,最近在StringCharacterView.swift提交中进行了修复。

有了这个修复,String.CharacterView的行为就像其他集合一样,因为它的切片应该对相同的元素使用与原始集合相同的索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40202639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档