【问题标题】:Why struct can use 'switch case'?为什么结构可以使用'switch case'?
【发布时间】:2019-12-18 07:51:22
【问题描述】:

看下面的代码:

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

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

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

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

【问题讨论】:

  • 您从哪里得知switch 只能与枚举一起使用?在Swift Programming Language book 中,“switch 语句考虑一个值并将其与几种可能的匹配模式进行比较。”。关于第一个问题,由于您没有包含 URLError 的完整定义,因此很难回答。并且不要发布代码图片,将其发布为文本
  • @JoakimDanielson URLError 是一个基础类。文档说它没有成员 code
  • @JeremyP 问题并不清楚,但在这种情况下,codeNSError 中定义
  • 我找不到URLErrorNSError 之间的关系。那么成员code 定义在哪里。@JoakimDanielson @JeremyP
  • 我从NSError.swift document知道了原因。 URLError 符合协议 _BridgedStoredNSError 并且该协议有一个成员 code.@JeremyP

标签: swift enums switch-statement


【解决方案1】:

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

根据to documentationError符合类型NSErrorNSError有属性code,这就是你可以使用code的原因

这不是枚举

urlError.code 具有 URLError.Code 类型,并且该类型符合协议 RawRepresentable(您可以阅读它here),这就是为什么您可以使用 switch-case 作为枚举

【讨论】:

  • 可以协议Error符合NSError类。你能给我一些介绍ErrorURLErrorNSError.@Vadim Nikolaev的关系的文档吗
  • 我会推荐official Apple document。在这里你可以看到与 NSError 的关系,你也可以阅读关于 Error 和 NSError here@dowZhang 的好信息
  • 我从NSError.swift document知道了原因。 URLError 符合协议 _BridgedStoredNSError 并且该协议有一个成员 code.@Vadim Nikolaev
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多