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 而不是 Dates 返回 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 &lt; $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 编译器导入

Swift 3:编译器无法识别子类 UIView 的类型

使用 Swift 4.1 编译的模块无法在 Swift 3.2.3 中导入

使用 Swift 2.3 编译的模块无法在 Swift 3.0 中导入