dea*_*rne 7 switch-statement swift
我有这个Result枚举:
public enum Result<T> {
case success(T)
case failure(Error)
}
Run Code Online (Sandbox Code Playgroud)
并希望实施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))"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
经过大量的讨论和设置代码后,我发现它是因为MyError没有实现CustomStringConvertible,所以交换机中的任何情况都不匹配.我认为这意味着从该方法返回垃圾.
那么,有谁知道为什么这个开关编译?
编辑
通过添加如下最终案例将其固定在操场上:
case .failure(let error):
return "Result.failure(\(error))"
Run Code Online (Sandbox Code Playgroud)
有用.但是,当我将其添加回我的应用程序时,编译器具有发出警告的大胆:warning: case is already handled by previous patterns; consider removing it- 这是Swift中的错误(不太可能)或者我是否误解了(Error和CustomStringconvertible更可能)之间的关系?
我假设您Foundation在定义类型的文件中导入Result。好吧,这会产生(有时)编译器将 Swift 值桥接到 Objective-C 兼容对象的不良影响,这就是您的情况所发生的情况。
删除该import Foundation子句将导致您的交换机由于不详尽而不再编译。我怀疑Foundation导入将CustomStringConvertible协议从.failure案例桥接到某个 Objective-C 值,但这是一个不正确的值,导致应用程序崩溃。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |