【问题标题】:Strange issue in converting from Swift 2 to Swift 3从 Swift 2 转换到 Swift 3 的奇怪问题
【发布时间】:2016-12-03 20:25:00
【问题描述】:

在转换这行代码时

a[0] = (a[0]! as NSArray).filteredArrayUsingPredicate(predicate)

a[0] = (a[0]! as NSArray).filtered(using:predicate)

我收到一个错误“无法推断通用参数Element” 然而改变功能是 XCode 的建议。 这可能是什么问题以及如何解决?

【问题讨论】:

  • 奇怪的代码。使用 Swift Array 和原生 filter 函数。
  • @vadian 但过滤后也是 Swift 函数,由 XCode 建议
  • Xcode 迁移器不是代码优化器。它只是尝试将现有代码更新为 Swift 3 语法。
  • 记录 a 并显示您初始化它的位置。
  • a[0] 是什么类型?这个问题没有足够的信息。您可能应该只使用a[0].filter(predicate)

标签: ios swift swift2 swift3


【解决方案1】:

所以,你的a被声明为Dictionary<Int, Array<AnyObject>>,那么错误的原因就很明显了。 (虽然错误信息具有误导性和混淆性,但请仅将其视为“存在一些与类型相关的错误”。)

查看NSArrayfiltered(using:)方法的结果类型:

filtered(using:)

声明

func filtered(using predicate: NSPredicate) -> [Any]

它返回[Any] -- Array<Any>。所以你不能将结果分配给a[0],它需要是[AnyObject] -- Array<AnyObject>

你可能需要这样写:

a[0] = (a[0]! as NSArray).filtered(using:predicate) as Array<AnyObject>

如前所述,尽量使用 Swift Arrays filter(_:) 方法,避免此类悲剧的发生……

【讨论】:

  • 非常感谢!错误现在消失了。错误信息很模糊1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多