Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何修复无法转换类型Result的值<;SuccessType<;A>;,错误>;关闭结果类型结果<;成功与失败>;敏捷的_Swift_Generics_Closures - Fatal编程技术网

Swift 如何修复无法转换类型Result的值<;SuccessType<;A>;,错误>;关闭结果类型结果<;成功与失败>;敏捷的

Swift 如何修复无法转换类型Result的值<;SuccessType<;A>;,错误>;关闭结果类型结果<;成功与失败>;敏捷的,swift,generics,closures,Swift,Generics,Closures,我试图映射Swift的结果类型以生成不同类型的新结果,但它不是类型检查,而是抛出错误: 错误:无法将类型Result的值转换为闭包结果类型Result 我尝试在结果上使用开关并在.success和.failure上进行匹配,但我得到了类似的类型检查错误。我还尝试过显式地指定输入和返回类型,但没有成功 我已经用我比较熟悉的其他语言(F#和Kotlin)复制了代码,它似乎在那里键入check swift编译器在这一行下显示一个sqiggly: 返回self.apply(input).map{resu

我试图映射Swift的结果类型以生成不同类型的新结果,但它不是类型检查,而是抛出错误:

错误:无法将类型Result的值转换为闭包结果类型Result

我尝试在结果上使用开关并在.success和.failure上进行匹配,但我得到了类似的类型检查错误。我还尝试过显式地指定输入和返回类型,但没有成功

我已经用我比较熟悉的其他语言(F#和Kotlin)复制了代码,它似乎在那里键入check

swift编译器在这一行下显示一个sqiggly:
返回self.apply(input).map{result in ParseSuccess(transform(result.data),result.input)}

这个代码哪里出了问题

<代码>导入基础 类ParseError:错误{ 让我们犯错误:字符串 init(uerr:String){ self.err=err } } 类解析成功{ 让数据:A 让输入:子字符串 init(u数据:A,u输入:子字符串){ self.data=数据 self.input=输入 } } 类解析器{ 设fn:(子字符串)->结果 init(fn:@escaping(子字符串)->Result){ self.fn=fn } func apply(u输入:子字符串)->结果{ 返回self.fn(输入) } func映射(u变换:@escaping(A)->B)->解析器{ 返回语法分析器{(输入)中的 返回self.apply(input).map{result in ParseSuccess(转换(result.data),result.input)} } } } 值得一提的是,我相信这可能不是开始编写解析器组合器的最佳方式,但我一直在努力找出我在这里哪里出错了


谢谢

返回解析器行中使用
Paraser
是一种奇怪的行为{
。当泛型类型以其非限定形式被提及时,在泛型类型的声明体中,类型参数被推断为未更改。例如,
Array
上的函数可以简单地返回
Array
,并且
T
隐含为与
self的
T
的值相同 将其更改为
returnparser{…
解决了这个问题


我是这样发现这个问题的。在处理泛型错误时,我总是尝试插入大量类型注释来“固定”数据类型,以确认编译器和我在同一页上

我首先写道:

func map<B>(_ transform: @escaping (A) -> B) -> Parser<B> {
    return Parser { (input) in 
        return self.apply(input).map { result in 
            let newData: ParseSuccess<B> = transform(result.data)
            return ParseSuccess(newData, result.input)
        }
    }
}  
func映射(u变换:@escaping(A)->B)->解析器{
返回语法分析器{(输入)中的
返回self.apply(input).map{result in
let newData:ParseSuccess=transform(result.data)
返回ParseSuccess(newData,result.input)
}
}
}  
此时错误更改为:

Untitled 2.swift:32:10: error: cannot convert return expression of type 'Parser<A>' to return type 'Parser<B>'
                return Parser { (input) in 
                       ^~~~~~~~~~~~~~~~~~~~
Untitled 2.swift:32:10:错误:无法将“Parser”类型的返回表达式转换为返回类型“Parser”
返回语法分析器{(输入)中的
^~~~~~~~~~~~~~~~~~~~

返回解析器行中使用
Paraser
是一种奇怪的行为{
。当泛型类型以其非限定形式被提及时,在泛型类型的声明体中,类型参数被推断为未更改。例如,
Array
上的函数可以简单地返回
Array
,并且
T
隐含为与
self的
T
的值相同 将其更改为
returnparser{…
解决了这个问题


我是这样发现这个问题的。在处理泛型错误时,我总是尝试插入大量类型注释来“固定”数据类型,以确认编译器和我在同一页上

我首先写道:

func map<B>(_ transform: @escaping (A) -> B) -> Parser<B> {
    return Parser { (input) in 
        return self.apply(input).map { result in 
            let newData: ParseSuccess<B> = transform(result.data)
            return ParseSuccess(newData, result.input)
        }
    }
}  
func映射(u变换:@escaping(A)->B)->解析器{
返回语法分析器{(输入)中的
返回self.apply(input).map{result in
let newData:ParseSuccess=transform(result.data)
返回ParseSuccess(newData,result.input)
}
}
}  
此时错误更改为:

Untitled 2.swift:32:10: error: cannot convert return expression of type 'Parser<A>' to return type 'Parser<B>'
                return Parser { (input) in 
                       ^~~~~~~~~~~~~~~~~~~~
Untitled 2.swift:32:10:错误:无法将“Parser”类型的返回表达式转换为返回类型“Parser”
返回语法分析器{(输入)中的
^~~~~~~~~~~~~~~~~~~~

BTW,您的解析错误和成功类型可能更适合表示为结构。在
ParseError
的情况下,甚至最好使用
enum
,使用离散的案例,而不是不同的
err
字符串值。顺便说一句,您的解析错误和成功类型可能更适合表示可表示为结构。在
ParseError
的情况下,最好使用
enum
,并使用离散的大小写,而不是不同的
err
字符串值。