Swift 为什么struct可以使用';开关盒';?

Swift 为什么struct可以使用';开关盒';?,swift,enums,switch-statement,Swift,Enums,Switch Statement,查看以下代码: public override func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { if let urlError = error as? URLError { switch urlError.code { case .cancelled:

查看以下代码:

public override func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
    
    if let urlError = error as? URLError {
        switch urlError.code {
        case .cancelled:
            print("cancelled")
        case .badURL:
            print("badURL")
        default:
            break
        }
    }
}
第一个问题:

URLError
没有属性
code
。它只有一个公共结构
code

那么为什么可以使用
urleror.code

第二个问题:
URLError.code
是一个结构。它有许多静态属性,代码如下:

它不是枚举。那么为什么可以使用语法
case.cancelled:

那么为什么可以使用urleror.code呢

根据
Error
符合类型
NSError
NSError
具有属性
code
,这就是为什么可以使用
code

它不是枚举


urleror.code
具有类型
urleror.code
,并且该类型符合协议
rawrrepresentable
(您可以阅读它),这就是为什么您可以使用
switch case
作为enum

的原因,您是从哪里想到
switch
只能与enum一起使用的?从中可以看出,“switch语句考虑一个值,并将其与几个可能的匹配模式进行比较。”。关于第一个问题,很难回答,因为您没有包含URLError的完整定义。不要发布代码的图像,将其作为text@JoakimDanielson是一个基础类。文档说它没有成员
code
@JeremyP问题不清楚,但在这种情况下,
code
是在
NSError
中定义的,我找不到
urleror
NSError
之间的关系。那么成员
code
是在哪里定义的。@JoakimDanielson@JeremyPI已经知道原因了
URLError
符合协议
\u BridgedStoredNSError
并且此协议有一个成员
code
@JeremyPCan协议
Error
符合类
NSError
。你能给我一些介绍
Error
urleror
NSError
@Vadim NikolaevI推荐的关系的文档吗。在这里,您可以看到与NSError的关系,也可以阅读有关错误的详细信息,NSError@dowZhangI已经从中了解了原因
URLError
符合协议
\u BridgedStoredNSError
,并且该协议有一个成员
code
@Vadim Nikolaev