iOS分享世界swift

Swift枚举熟练运用必备知识

2022-05-25  本文已影响0人  Sweet丶

Swift中的枚举有原始值和关联值,其使用范围相比OC来说多了很多,因此也更复杂,需要我们花更多的时间来学习它,本文是对学习后和在实际中的运用做的一个总结。
目前来看需要掌握的内容如下:

Swift枚举内容.jpg
一、Swift枚举声明
>>> A. 枚举的类型及原始值、关联值
// 1.这里的原始值类型是Character,如果不写明= "d"则会报错. 
// 2.如果是不写原始值类型Character,默认是Int。
// 3.对于原始值类型是Int或者String,不写明“=”后面的也不会报错。
enum Direction: Character { 
    case north = "d"
    case south = "s"
    case east = "e"
    case west = "w"
}

// 带枚举关联值的枚举
enum Score {
    case point(Int, Int, Int)
    case grade(Character)
}

// case中关联值有自身枚举类型的递归枚举
indirect enum ArithExpr {
    case number(Int)
    case sum(ArithExpr, ArithExpr)
    case difference(ArithExpr, ArithExpr)
}
>>> B. 枚举的其它性质

Swift中枚举可以遵守协议,可以添加成员方法、静态方法、静态变量、计算属性。

enum BasketballNum4: Character, CaseIterable {
    case AAAA16 = "2"
    // 可添加计算属性
    var name: String { "dandy" }
    // 可添加静态变量
    static var name2: String { "dandy.static" }
    // 可添加成员方法
    func testSelf() {
        print(self.name)
        print(Self.name2)
    }
    // 可添加静态方法
    static func testSelf2() {
        print(self.name2)
    }
}
二、枚举变量的内存

弄清楚枚举的内存使用情况能让我们在使用时对性能消耗有所了解。
使用MemoryLayout可以查看分配内存和使用内存情况,比如下面的方式:

    print("MemoryLayout<String>.size", MemoryLayout<String>.size)
    print("MemoryLayout<String>.stride=", MemoryLayout<String>.stride)
    print("MemoryLayout<String>.alignment=", MemoryLayout<String>.alignment)
2.1 关联值的存储
2.2 原始值的存储

rawValue是一个计算属性,在编译时就已经确定了每个枚举值对应的rawValue值,不需要存储。证明方法: 可以分析swift文件编译过程生成的中间文件sil
可以参考文章:Swift进阶(六)枚举和可选类型

2.3 枚举中方法、计算属性在内存中什么位置?
三、Swift枚举应用举例
// 在OC中是分别有onNext、onComplete、onError三个方法,RxSwift的内部中转方法只使用一个on
func on(_ event: Event<Element>)
public enum Event<Element> {
    /// Next element is produced.
    case next(Element)
    /// Sequence terminated with an error.
    case error(Swift.Error)
    /// Sequence completed successfully.
    case completed
}
四、OC中使用Swift枚举

OC文件中导入#import "项目名-Swift.h"文件后去使用。

'@objc' enum must declare an integer raw type.
枚举原始值类型为Int的Swift枚举才允许在OC中使用,并且Swift枚举前需要加@objc。注意:OC中Integer就是Swift中的Int。

五、Swift中使用OC枚举

将OC枚举所在的文件导入到桥接文件中项目名-Bridging-Header.h
Swift中用枚举类型名 + 点语法就可以了。

OC中定义字符串枚举:
Apple官方的做法

.h 文件中
typedef NSString *AddressRecType NS_STRING_ENUM;

FOUNDATION_EXPORT AddressRecType const AddressRecTypeHistory;
FOUNDATION_EXPORT AddressRecType const AddressRecTypeCurrentLocation;
FOUNDATION_EXPORT AddressRecType const AddressRecTypeRGeo;

.m 文件中
AddressRecType const AddressRecTypeHistory = @"history";
AddressRecType const AddressRecTypeCurrentLocation = @"curLocation";
AddressRecType const AddressRecTypeRGeo = @"RGeo";

.swift 文件中 --------------
let enum5 = AddressRecType.currentLocation

有些情况使用字符串枚举更合适,比如:你写一个Pod私有库需要提供给Swift新项目中业务方使用,他们使用的方式是需要取到这个枚举对应的一个字符串类型作为参数去发送请求,这个参数如果由业务方根据枚举做一层映射的话,这样业务方麻烦,也怕他们会写错。
这个时候可以在OC中定义字符串枚举后,在Swift中使用该枚举的rawValue来取得这个字符串就能避免这个问题。

上一篇 下一篇

猜你喜欢

热点阅读