【问题标题】:"Ambiguous use of prefix" compiler error with Swift 3Swift 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

【问题讨论】:

    标签: swift3 xcode8


    【解决方案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)编译
    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2016-10-15
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多