【问题标题】:Passing Data into function that accepts generic collection将数据传递给接受通用集合的函数
【发布时间】:2016-10-22 09:20:34
【问题描述】:

我有一个接受泛型集合的函数。

func foo<T: BidirectionalCollection>(_ bar: T)
    where T.Iterator.Element == UInt8,
          T.SubSequence: BidirectionalCollection & RangeReplaceableCollection,
          T.SubSequence.Iterator.Element == UInt8,
          T.SubSequence.Index == T.Index,
          T.SubSequence.SubSequence == T.SubSequence
{
    //
}

我想用Data 作为 T 调用这个函数:

foo(Data())

但是,这会产生错误:

错误:无法推断通用参数“T”

这里发生了什么?如何使用Data 实例正确调用函数?

【问题讨论】:

  • 如果我通过 [UInt8] 而不是 Data,它会起作用。那有什么不同?

标签: swift generics collections


【解决方案1】:

我认为问题在于Data.SubSequence不符合RangeReplaceableCollection协议,而你的泛型函数有这个要求:

T.SubSequence: BidirectionalCollection & RangeReplaceableCollection

【讨论】:

  • 哇,我认为Data 只是一个具有更多功能的美化[UInt8]。这是一个 Swift 错误还是我对 Data 的理解不正确?
  • @Etan: Etan 是 ObjC 的 NSData 的“后代”。有关详细信息,请参阅:github.com/apple/swift-evolution/blob/master/proposals/…NS 前缀在 Swift 3 中被删除,作为将基础类引入标准 API 指南的一部分。
  • @AntonBronnikov:这不是 NS 前缀丢弃的情况(如github.com/apple/swift-evolution/blob/master/proposals/… 中所述,例如NSBundle 变为Bundle)。 DataNSData 的覆盖类型,在 Swift 中仍然存在。
  • Linux 上独立于平台的 Foundation 中的 Data 怎么样?抱歉,我现在有点糊涂了。
  • @MartinR,是的,我的错。我的印象是,保留 NSData 是出于向后兼容性的原因,其中仍然需要引用行为并且稍后会在某个时候被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2018-03-12
  • 2019-10-23
  • 2012-08-06
相关资源
最近更新 更多