Swift 3 的“前缀的模糊使用”编译器错误
Posted
技术标签:
【中文标题】Swift 3 的“前缀的模糊使用”编译器错误【英文标题】:"Ambiguous use of prefix" compiler error with Swift 3 【发布时间】:2016-06-20 20:20:51 【问题描述】:我刚刚将我的项目从 Swift 2.2 迁移到带有 Xcode 8 beta 的 Swift 3.0。
我有类似下面的代码(你可以把它粘贴到操场上):
import Foundation
let datesWithCount: [(Date, Int)] = [(Date(), 1), (Date(), 2), (Date(), 3)]
let dates: [Date] = datesWithCount.sorted
$0.0 < $1.0
.prefix(1).map
return $0.0
在 Swift 2.2 中编译得很好。但是,使用 Swift 3.0 我得到了错误
“前缀”的模糊使用
在 Swift 3.0 中编译它的唯一方法是将地图拆分为单独的一行:
let sortedDatesWithCount = datesWithCount.sorted
$0.0 < $1.0
.prefix(1)
let mappedDates = sortedDatesWithCount.map
return $0.0
顺便说一句,在实际代码中,我从 map
而不是 Date
s 返回 NSNotification
对象,但错误是相同的。我只是在这里使用Date
来简化示例。
有什么办法可以将它编译为一个衬里?
更新:为 Swift 项目创建了一个 JIRA。
【问题讨论】:
【参考方案1】:如果您在将 ArraySlice 传递给 map
之前将其制成一个数组,则它可以工作:
let dates: [Date] = Array(datesWithCount.sorted
$0.0 < $1.0
.prefix(1)).map return $0.0
这看起来像编译器中的类型推断错误。
【讨论】:
日期符合 Swift 3 中的 Comparable 协议。sorted $0.0 < $1.0
应该足够了
谢谢,我不知道。这是个好消息! // 我只是在使用 OP 的代码,他们说 Date 只是一个例子。 :)
对我来说也像是一个类型推断错误。我会这样报告它。 @LeoDabus 感谢有关排序日期的提示。真正的代码实际上也是按日期排序的。示例位正在从地图中返回日期。
供将来参考:我发现了@mluisbrown 创建的问题 (bugs.swift.org/browse/SR-1856),这个错误的原因是 在 .prefix(...)
之后出现的,所以解决方案实际上只是确保prefix
调用是最后一个调用(如果需要,分成多个变量)。
SR-1856已修复,原代码用Swift 4.1 (beta)编译以上是关于Swift 3 的“前缀的模糊使用”编译器错误的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2 升级 Swift 3 在许多方法中编译错误,例如 willTransitionToTraitCollection:newCollection:withTransitionCoordin
在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误
使用 Swift 4.0.3 编译的模块不能被 Swift 4.2.1 编译器导入