Swift 与 OC 枚举的异同

本文探讨了Swift枚举与Objective-C(OC)枚举的异同,强调Swift枚举的高级特性,如实现协议、递归、关联值等。通过示例展示了如何使用枚举简化错误处理,以及如何利用枚举建模解决24点游戏算法,阐述了枚举在表达式引擎设计中的作用。文章最后分享了作者的Java面试资料和学习资源。
摘要由CSDN通过智能技术生成
  1. 作为一个类型,可以实现协议,定义扩展

  2. 实现递归枚举,可以很方便的表示类似列表或者树的结构,配合递归函数降低理解成本。

这些特性官方文档都有详细的说明,这里就不展开了。

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

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值