swift - 递归解析 CollectionType

标签 swift generics recursion types

我正在编写一个递归下降解析器。我希望我的解析器能够处理 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 中不再有 CollectionTypeArrayArraySlice 都采用Sequence .您使用的 dropFirst() 方法在 Sequence 中声明。所以你可以像这样制作递归泛型函数:

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

关于swift - 递归解析 CollectionType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34074624/

相关文章:

scala - 并非在所有情况下都强制执行类型别名参数边界

java - Java中如何调用参数化方法?

java - 如何使 Java 方法变得通用?

java - 使用 Java 进行排序和二分搜索

python - 递归找零算法

ios - 下载后移动项目

arrays - Swift 对多个 Bool 值的数组进行排序

Swift assert() 无法与 nil 进行简单比较

ios - 标签的持续时间

python - 辅助函数与主函数同名吗?