为什么编译器抱怨我对 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
}
}
- 编译器显然已经找到了 Encodable 协议中定义的初始化器——T($0) 将产生一个 T?。
- flatMap 有一个适当的重载,它应该产生一个 [T]。
- 我不知道“闭包结果类型‘_’”是什么意思。
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=]) }
}
}
我已经定义了一个协议和一个数组扩展。编译器在扩展的编码方法中调用 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
}
}
- 编译器显然已经找到了 Encodable 协议中定义的初始化器——T($0) 将产生一个 T?。
- flatMap 有一个适当的重载,它应该产生一个 [T]。
- 我不知道“闭包结果类型‘_’”是什么意思。
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=]) }
}
}