为什么编译器抱怨我对 FlatMap 的转换参数?

Why Is the Compiler Complaining About My Transform Argument to FlatMap?

我已经定义了一个协议和一个数组扩展。编译器在扩展的编码方法中调用 flatMap 时报告错误:无法将类型 'T?' 的值转换为闭包结果类型 '_'

public protocol Encodable {
    typealias Properties = Dictionary<String, Any>
    func encode() -> Properties
    init?(_ properties: Properties?)
}

extension Array where Element : Encodable.Properties {
    func encode<T:Encodable>(type: T.Type) -> [T] {
        return flatMap{ T([=10=]) } // <= Compiler Error
    }
}

xcode 8.3 正在使用 swift 3.1(也许我不应该更新 Xcode?)

有什么想法吗?

在一个小项目中编译你的代码,我发现另一个错误:

<unknown>:0: error: type 'Element' constrained to non-protocol type 'Encodable.Properties'

因此,约束 Element : Encodable.Properties 无效并且 Swift 无法为 T([=13=]) 找到合适的初始值设定项。通常会发现 Swift 在出现与类型推断相关的问题时会生成不适当的诊断。

据我测试,此代码使用 Swift 3.1/Xcode 8.3:

编译
extension Array where Element == Encodable.Properties {
    func encode<T:Encodable>(type: T.Type) -> [T] {
        return flatMap{ T([=11=]) }
    }
}