swift – 这种类型错误的原因是什么?

swift – 这种类型错误的原因是什么?,第1张

概述两个问题: >为什么这段代码无法编译?我相信(但我不是100%肯定,我可能犯了一个错误)它是类型正确的. >错误消息是什么意思?我很困惑为什么预期的参数类型是_ – > _(或者我只是不知道_ – > _在这种情况下是什么意思).这个问题的目标是学习如何正确诊断此错误消息,如果我将来再次遇到它. 代码: 此代码无法编译,并显示错误消息“无法将类型’A – > B’的值转换为预期的参数类型’_ – 两个问题:

>为什么这段代码无法编译?我相信(但我不是100%肯定,我可能犯了一个错误)它是类型正确的.
>错误消息是什么意思?我很困惑为什么预期的参数类型是_ – > _(或者我只是不知道_ – > _在这种情况下是什么意思).这个问题的目标是学习如何正确诊断此错误消息,如果我将来再次遇到它.

代码:

此代码无法编译,并显示错误消息“无法将类型’A – > B’的值转换为预期的参数类型’_ – > _’:

class ZipList<A> {    let xs: [A]    init(xs: [A]) {        self.xs = xs    }    func map<B>(f: A -> B) -> ZipList<B> {        return ZipList(xs: self.xs.map(f))    }}

附加信息:

起初,我认为问题是类型推断,所以我尝试明确写出类型,但也失败了:

但是,这个编译得很好(与原始地图版本的唯一区别是< B>传递给ZipList初始化程序):

func map4<B>(f: A -> B) -> ZipList<B> {    return ZipList<B>(xs: self.xs.map(f))}
解决方法 问题是,当你引用它时没有显式提供ZipList的泛型参数类型时,编译器会尝试为你推断它 – 它并不总是正确的.

因为你已经在ZipList中了< A>在类中,编译器将尝试推断ZipList为ZipList< A>省略通用参数时(有关此行为的详细信息,请参阅this question).

因此,它现在期望在ZipList(xs:_)初始化器中输入[A],这意味着地图函数被推断为A – >. A,你试图通过A – > B到,导致类型不匹配(这就是为什么f突出显示为错误中的问题).

如果您简化示例只是在ZipList上调用init()而不提供参数,您将看到更有用的错误消息:

class ZipList<A> {    init() {}    func map<B>() -> ZipList<B> {        // error: Cannot convert return Expression of type 'ZipList<A>' to 'ZipList<B>'        return ZipList()     }}

编译器完全忽略map()方法返回的显式类型注释这一事实是一个错误,并由SR-1789跟踪.正如Jordan Rose在报告评论中所描述的那样,原因是:

It seems to be a case of us eagerly assuming the parameters are the same as for self. (That’s usually a feature,but not when it gets in the way of other inference.)

正如您已经发现的那样,解决方案是在创建新实例时显式声明ZipList的泛型参数类型:

return ZipList<B>(xs: xs.map(f))

这会强制泛型参数为B类,因此阻止Swift错误地推断它,允许map函数解析.

至于错误消息“无法将类型’A – > B’的值转换为预期的参数类型’_ – > _”意味着,_在这种情况下,简单地指的是编译器无法解析的泛型类型(不是有用的错误信息,我知道).所以编译器告诉你的是,它期望一个函数接受一个未知类型的输入,并返回相同的类型.

在诊断这些类型的错误消息时,通常有助于将表达式拆分为多个子表达式,并检查每个类型的类型以尝试查找不匹配.它也可以帮助开始简化示例(比如在map方法中使用init()而不是init(xs:[A]),直到遇到更有用的错误消息.

总结

以上是内存溢出为你收集整理的swift – 这种类型错误的原因是什么?全部内容,希望文章能够帮你解决swift – 这种类型错误的原因是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1007237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存