递归解析CollectionType

问题描述 投票:1回答:1

我正在写一个递归下降解析器。我希望我的解析器能够处理UInt8的任何(或至少“很多”)集合(例如,不仅仅是Swift.Array)

func unpack<T: CollectionType where T.Generator.Element == UInt8>(t: T) {
    let m = t.dropFirst()
    //[do actual parsing here]
    unpack(m)
}

然而:

error: cannot invoke 'unpack' with an argument list of type '(T.SubSequence)'
note: expected an argument list of type '(T)'

这令人费解,因为:

  1. dropFirst返回Self.SubSequence
  2. CollectionType.SubSequenceSubSequence : Indexable, SequenceType = Slice<Self>
  3. SliceCollectionType
  4. 因此,m应该是CollectionType

但由于某种原因,这不起作用。如何定义unpack以便递归传递子序列?

swift generics recursion types
1个回答
0
投票

Swift中没有CollectionType了。 ArrayArraySlice都采用Sequence。你使用的dropFirst()方法在Sequence中声明。所以你可以像这样制作递归泛型函数:

func unpack<T: Sequence>(t: T) where T.Element == UInt8 {
    let m = t.dropFirst()
    //[do actual parsing here]
    unpack(m)
}
© www.soinside.com 2019 - 2024. All rights reserved.