一、枚举解析
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)