-
作为一个类型,可以实现协议,定义扩展
-
实现递归枚举,可以很方便的表示类似列表或者树的结构,配合递归函数降低理解成本。
这些特性官方文档都有详细的说明,这里就不展开了。
Swift中的枚举和OC枚举的相同之处就是名称一样,内涵和外延已经完全不同,其核心价值在于提供了在多种类型(而非仅仅整型)间做选择的机制,在将这种机制的实现细节与对外抽象分离的同时,赋予其上述所有的能力,这提供了更高的抽象层次和更强的表现能力。
接下来我们来看一个简单的例子和一个综合应用的例子。
牛刀小试——简化错误处理
之前,函数的正常结果和异常结果是无法统一的,体现在代码上往往以类似if(someValue !=nil) {} else {}
的方式来处理,有了枚举之后,可以利用Optional将两种结果进行抽象统一,从而简化错误流程。下面这个例子的作用是从一个json字符串实例化为模型对象:
正常的代码:
func makeModel1(s : String?) -> Model?
{
let d1 = s?.data(using: String.Encoding.utf8)
// 判断是否为空
if let a = d1 {
// 可能throw的代码try一下
guard let dict = try? JSONSerialization.jsonObject(with: a) as? Dictionary<String, String> else {
fatalError(“Json data error”)
}
let model = Model.init(dict: dict)
return model
}
return nil
}
利用Optional简化后的代码
func makeModel2(s : String?) -> Model?
{
s?.data(using: String.Encoding.utf8).map{
try? JSONSerialization.jsonObject(with: $0)
}.map {
Model.init(dict: $0 as! Dictionary<String, String>)
}
}
这个逻辑并不复杂,但还是足以显示出合理抽象的威力,Optional提供了这样一种抽象,将错误处理的细节屏蔽掉了,我们只需要写数据转换的主逻辑,这种写与读的顺畅性在带给我们愉悦的同时,也提升了程序的正确性。在实际场景会遇到更复杂的多层嵌套各种if的代码,主流程非常不清晰&#x