Swift 从正常集合索引和反向集合索引创建范围

Swift 从正常集合索引和反向集合索引创建范围,swift,generics,collections,reverse,Swift,Generics,Collections,Reverse,(一个更大问题的简化示例。是的,我知道这个具体的简化示例可以用更简单的方法解决。) 我有一个包含一些ASCII码点的集合,我想删除其中的前导空格和尾随空格 func foo<T: BidirectionalCollection>(_ buffer: T) -> String where T.Iterator.Element == UInt8, T.SubSequence.Iterator.Element == T.Iterator.Element {

(一个更大问题的简化示例。是的,我知道这个具体的简化示例可以用更简单的方法解决。)

我有一个包含一些ASCII码点的集合,我想删除其中的前导空格和尾随空格

func foo<T: BidirectionalCollection>(_ buffer: T) -> String
    where T.Iterator.Element == UInt8,
          T.SubSequence.Iterator.Element == T.Iterator.Element
{
    if let valueStart = buffer.index(where: { $0 != 0x20 /* SP */ }),
       let valueEnd = buffer.reversed().index(where: { $0 != 0x20 /* SP */ })
    {
        return String(bytes: buffer[valueStart ... valueEnd], encoding: .utf8)!
    } else {
        return ""
    }
}
func-foo(ubuffer:T)->字符串
其中T.Iterator.Element==UInt8,
T.SubSequence.Iterator.Element==T.Iterator.Element
{
如果let valueStart=buffer.index(其中:{$0!=0x20/*SP*/}),
让valueEnd=buffer.reversed().index(其中:{$0!=0x20/*SP*/})
{
返回字符串(字节:缓冲区[valueStart…valueEnd],编码:.utf8)!
}否则{
返回“”
}
}
但是,我得到了这个错误:

错误:二进制运算符“…”不能应用于“T.Index”和“ReversedIndex”类型的操作数

各国的文件:

如果需要相同类型的反向集合,则可以使用该集合的基于序列或基于集合的初始值设定项

但是,当我尝试在
T()
中嵌入
buffer.reversed()
时,出现以下错误:

错误:“T”无法构造,因为它没有可访问的初始值设定项

因为,很明显,初始值设定项是在其他地方定义的

最后,我不需要整个反向集合都是某种类型。我只希望能够从原始集合的索引和相应的反向集合的索引构建范围


这里我忽略了什么?

为了从
ReversedIndex
获取基础集合的索引,只需使用其属性即可

尽管需要注意的是,由于
ReversedCollection
的方式,这实际上会返回基本集合中给定索引上方的索引(因为
startIndex
映射到
endIndex
——这是一个“结束后”索引)

因此,您可以简单地使用半开范围运算符
。。
func foo<T: BidirectionalCollection>(_ buffer: T) -> String
    where T.Iterator.Element == UInt8,
    T.SubSequence.Iterator.Element == T.Iterator.Element
{
    if let valueStart = buffer.index(where: {$0 != 0x20}),
        let valueEnd = buffer.reversed().index(where: {$0 != 0x20})?.base
    {
        // goes without saying that this will crash if String(bytes:encoding:) returns nil.
        return String(bytes: buffer[valueStart ..< valueEnd], encoding: .utf8)!
    } else {
        return ""
    }
}
let index = (buffer.reversed().index{ $0 != 0x20 }?.base).map{ buffer.index(before: $0) }