当前位置: 首页 > 知识库问答 >
问题:

为什么这个开关在不详尽的情况下会编译?

慕容晔
2023-03-14

我有这个Result枚举:

public enum Result<T> {
    case success(T)
    case failure(Error)
}

并且想实现CustomStringConvertible,所以我做到了。(不要在这上面戳洞,这个问题已经简化了:):

extension Result: CustomStringConvertible {

    public var description: String {
        switch self {
        case .success(let value as CustomStringConvertible):
            return "Result.success(\(value.description))"
        case .success(let value):
            return "Result.success(\(value))"
        case .failure(let error as CustomStringConvertible):
            return "Result.failure(\(error.description))"
        }
    }
}

在Playground中运行它完全符合要求。但是,它会在最终的r.description中出错。(同样的运行时失败发生在我的应用程序中,所以这与在游乐场中无关。)

var r: Result<String> = .success("hello")
r.description

r = .failure(NSError(domain: "", code: 0, userInfo: nil))
r.description

struct MyError: Error { }
r = .failure(MyError())
r.description

经过大量的头疼和代码设置,我发现这是因为MyError没有实现CustomStringConverable,所以开关中没有匹配的情况。我假设这意味着垃圾从该方法返回。

那么,有人知道为什么要编译这个开关吗?

编辑

在操场上通过添加这样的最后一个案例解决此问题后:

case .failure(let error):
    return "Result.failure(\(error))"

它起作用了。然而,当我将其添加回我的应用程序时,编译器竟然发出警告:<代码>警告:案例已经由以前的模式处理;考虑删除它-这是Swift中的一个错误(不太可能),还是我误解了错误和自定义字符串转换(更可能)之间的关系?

共有1个答案

李飞翼
2023-03-14

我假设您在定义Result类型的文件中导入Foundation。好吧,这会产生编译器将Swift值桥接到Objective-C兼容对象的(有时)不必要的效果,这就是它在您的情况下发生的情况。

删除import Foundation子句将导致您的交换机由于不完整而不再编译。我怀疑导入将CustomStringConvertible协议与连接起来。失败case转换为某个Objective-C值,但该值不正确,导致应用程序崩溃。

 类似资料:
  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 本文向大家介绍datanode在什么情况下不会备份相关面试题,主要包含被问及datanode在什么情况下不会备份时的应答技巧和注意事项,需要的朋友参考一下 解答: 当分备份数为1时。

  • 问题内容: 今天,在浏览各种问题时,我遇到了一个问题,在我看来有点不可思议,为什么一个人要在上面加上a ,对于这种情况会不会有什么真正的原因,所以这只是微不足道的吗? 问题答案: 动画图像作为GUI的BG。我使用HTML来调整此尺寸(x3),但是如果它已经是所需的尺寸,则可以直接将其设置为标签的。 不知道它是否是“真正的”。这似乎是一个主观术语,需要更多说明。我从来没有使用过这种方法,只是想通了,

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 问题内容: 来自问题的原因,或者说更确切地说,object .__new__在这两种情况下的工作方式不同 作者对为什么不感兴趣,而对如何感兴趣。 我非常想了解原因,尤其是: 为什么不打印任何参数而不是 为什么没有为testclass3引发错误?(因为除了自我之外没有其他参数) 码 问题答案: 您正在使用旧的Python版本;此错误消息已更新: Python只会抱怨既不支持又不被覆盖的参数。例如,当