重学Swift第六篇:枚举、错误处理

本文详细探讨了Swift中的枚举,包括语法、成员遍历、关联值、原始值、递归枚举、枚举大小以及与Objective-C的混编。同时,文章还介绍了Swift的错误处理机制,包括如何抛出和捕获错误,以及不同处理方式的实例。
摘要由CSDN通过智能技术生成

一、枚举解析

1.1 语法

enum Color {
   
    case red
}

与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。把上面代码转为sil代码

enum Color {
   
  case red
  @_implements(Equatable, ==(_:_:)) static func __derived_enum_equals(_ a: Color, _ b: Color) -> Bool
  var hashValue: Int {
    get }
  func hash(into hasher: inout Hasher)
}

Swift的枚举默认实现Hashable协议。

1.2 成员遍历

enum Color: CaseIterable {
   
    case red
}
//Color.allCases

转为sil

enum Color : CaseIterable {
   
  case red
  @_implements(Equatable, ==(_:_:)) static func __derived_enum_equals(_ a: Color, _ b: Color) -> Bool
  var hashValue: Int {
    get }
  func hash(into hasher: inout Hasher)
  typealias AllCases = [Color]
  static var allCases: [Color] {
    get }
}

可以看到AllCases会被关联到Color数组,而allCases是只有get方法,所以只能被访问不能被修改。
在这里插入图片描述
调用allCases就是把每一个case元素加入到数组中,然后返回该数组。

1.3 关联值

enum Color {
   
    case red(String)
}
let red = Color.red("0xFF")
//模式匹配
switch red {
   
    case .red("0xFF"):
        print("红色")
    //case .red(let hexStr):   //值绑定
    //    print(hexStr)
    default:
        print("unknown")
}
//单匹配
if case let Color.red(hexStr) = red {
    
	 print("Color hexStr:\(hexStr)")
}

在这里插入图片描述
在这里插入图片描述

1.4 原始值

原始值可以是字符串、字符,或者任意整型值浮点型值。每个原始值在枚举声明中必须是唯一的。

enum Color: String {
   
    case red = "0xFF"   //显示赋值
    case green         //隐式赋值
}

转为sil

enum Color : String {
   
  case red
  case green
  typealias RawValue = String
  init?(rawValue: String)
  var rawValue: String {
    get }
}

带原始值的枚举在原有基础上多实现了RawRepresentable协议。

下面看一下sil下的init(rawValue:)方法
在这里插入图片描述
先是创建了一个Array< StaticString >来存放每一个原始值
在这里插入图片描述
通过把原始值变为StaticString存储到Array中,StaticString的初始化方法为StaticString.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:),可知各参数涵义。
在这里插入图片描述
通过_findStringSwitchCase(cases:string:)查找,返回一个match值,在cases数组中找到了就返回对应的index,没找到返回-1。

@_semantics("findStringSwitchCase")
public // COMPILER_INTRINSIC
func _findStringSwitchCase(
  cases: [StaticString],
  string: String) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值