gpt4 book ai didi

swift - 无法将类型 'Result' 的值转换为闭包结果类型 'Result'

转载 作者:可可西里 更新时间:2023-11-01 01:47:38 30 4
gpt4 key购买 nike

在将旧的(不是我的)代码从 swift 2 转换为 swift 4 之后,我需要泛型和返回类型方面的帮助

let cryptedJsonData = packet.encodeJSON()
.flatMap { $0.gzippedData() } //here I am getting error

Cannot convert value of type 'Result<Data, Error>' to closure result type 'Result<T, E>'

平面图函数

extension Result {

func map<U>( _ function: @escaping (T) -> U ) -> Result<U, E> {
return flatMap { .success( function( $0 ) ) }
}

func flatMap<U>( _ function: (T) -> Result<U, E> ) -> Result<U, E> {

switch self {
case .success(let value): return function(value)
case .failure(let error): return .failure(error)
}
}

压缩数据()

 private let CHUNK_SIZE: Int = 2 ^ 14

func gzippedData() -> Result<Data, Error> {

var data = Data(count: CHUNK_SIZE)

return .success( data as Data)
}

结果

enum Result<T, E> {

case success(T)
case failure(E)
}

最佳答案

如果您定义了自己的 Result 类型,我怀疑问题源于不同模块中 Result 的两个定义之间的类型不兼容。

请注意,在 Swift 的标准库中已经定义了一个 Result 类型(参见 https://developer.apple.com/documentation/swift/result ),其实现与您发布的非常接近。如果您实际上定义了自己的类型,则 encodeJSON() 返回的 Result 可能与 返回的 Result 不同gzippedData()。不幸的是,Swift 处理名称冲突的能力很差,尤其是当名称与标准库中的名称一起出现时。

这里有一种方法可以重现您的问题:

// This enum is defined in my own source.
enum Result<T, E> {
case success(T)
case failure(E)
}

// This is an dummy error type, with the sole purpose of specializing `Result`.
enum SomeError: Error {}

// This extension has for sole purpose to add a method to `String` that returns
// an instance of *my* `Result` type.
extension String {
func foo() -> Result<String, SomeError> {
return .success(self)
}
}

// Now assume this function comes from a third party library that uses Swift's
// `Result` type, from the standard library.
func bar() -> Swift.Result<String, SomeError> {
return .success("Hello, World!")
}

// The following line will trigger the exact same error as yours, because the
// `Result` type that expects `flatMap`'s argument is not *my* `Result` type,
// but that of Swift's standard library.
bar().flatMap { $0.foo() }

请注意,如果您将 Swift.Result 替换为 bar 的 codomain 上的 Result(假设您也为 flatMap 提供定义)。


如果您定义了自己的 Result 类型,我建议您要么使用 Swift 的类型,我猜它的行为完全符合您的预期,要么重命名您自己的类型,这样它的定义就不再与 Swift 的定义冲突标准库。

关于swift - 无法将类型 'Result<Data, Error>' 的值转换为闭包结果类型 'Result<T, E>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089589/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com