前言
14年Swift刚出的时候开始学习的Swift,后来由于项目需要,一直写App还是用的OC。最近打算把Swift重新捡起来,这个Objective C转Swfit系列就当成是我的复习笔记,顺便写成博客记录下来吧。
这个系列不是讲解Swift基础,主要是讲解OC(以下OC均指的是Objective C)转过来的同学有些习惯要改变了,才能更好的使用Swift的很多优秀特性。
枚举
通常,你在Objective C中,用枚举NS_ENUM来定义有限的状态,比如,假如我们要表示一个登录的结果
typedef NS_ENUM(NSInteger,LHLoginResult){
LHLoginResultSucceess, //成功
LHLoginResultFailure, //失败
LHLoginResultError, //出错了
};
其实,OC中,枚举更像一个加强版的整型
假如,把这个简单的转为Swift,那么看起来是这样子的。
enum LoginResult {
case Success
case Failure
case Error
}
如果是这么写枚举,你真的是暴殄天物了
Swift枚举是first-class types
,它有很多Swift class具有的特性
- Associated Values 关联值
- 计算属性
- 实例方法
- 构造函数
- 遵循协议
- 支持extensions
好了,那么Swift中,这样的一个“登录结果”应该如何用枚举来表示呢?
通常,失败的时候,我们希望知道失败的原因是啥,出错的时候,我们希望知道错误的原因是啥。
利用Associated Values 关联值,来实现这一点
于是,这个枚举变成了酱紫
enum LHLoginResult {
case Success
case Failure(message:String)
case Error(error:NSError)
}
等等,现在是三种结果,要是能提供一个接口,只返回给我一个Bool,告诉我登陆成功还是失败就更好了
利用Extension和计算属性,我们添加一个方便的接口
extension LoginResult{
var isSuccess:Bool{
switch self {
case .Success:
return true
default:
return false
}
}
}
通常,App需要Log出一些信息,我们继续完善这个枚举,让它支持Log
用extension,让这个枚举遵循协议CustomStringConvertible(Swift中的一个log相关的协议)
extension LoginResult:CustomStringConvertible{
var description: String {
switch self {
case .Success:
return "Success"
case let .Failure(message):
return message
case let .Error(error):
return error.localizedDescription
}
}
}
除此之外,Swift的枚举还支持RawValues
enum ASCIIControlCharacter: Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
再深入一点,我们来看看Swift中一些默认使用枚举来定义的类型
Optional
public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
case None
case Some(Wrapped)
/