gpt4 book ai didi

swift - SubSequence 索引的兼容性

转载 作者:行者123 更新时间:2023-11-28 16:06:30 28 4
gpt4 key购买 nike

对于大多数 Swift Collections , 索引 Collection's SubSequence与底座兼容 Collection .

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]
}

这适用于大多数集合:

print(foo([0, 1, 2, 3, 4])) // 2

甚至对于 String.UTF8View :

print(foo("01234".utf8) - 0x30 /* ASCII 0 */) // 2

但是当使用 String.CharacterView 时,事情开始破裂:

print(foo("01234".characters)) // "0"

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

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。


  • 为什么字符串子序列索引与其基字符串不兼容?只要一切都是不可变的,对我来说为什么字符串是一个特例就没有意义,即使有所有的 Unicode 东西。我还注意到子字符串函数返回字符串,而不是像大多数其他集合那样返回切片。但是,子字符串仍记录在 O(1) 中返回。奇怪的魔法。

  • 有没有办法限制泛型函数以限制子序列索引与基本序列兼容的集合?

  • 是否可以假设 SubSequence 索引与非字符串集合兼容,或者这只是巧合,并且应该始终使用 distance(from:to:)转换指数?

最佳答案

那是discussed on swift-evolution , 提交为错误报告 SR-1927 – Subsequences of String Views don’t behave correctly最近被修复了在 StringCharacterView.swiftcommit .

通过修复 String.CharacterView 的行为与其他集合一样,它的切片应该对与原始集合相同的元素使用相同的索引。

关于swift - SubSequence 索引的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40202639/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com