刚开始很疑惑,为啥枚举要整个关联值出来,用处在什么地方?
经过的学习和思考后有了一点自己理解。
首先,来看一个OC写的枚举的例子。
app跳转一个网页有两种情况:
- 直接跳转的形式
- 拼接token后,再跳转
先来定义个枚举
typedef NS_ENUM(NSInteger ,PowerType) {
Power_Type_0 = 0,//不对url做任何处理,直接加载
Power_Type_1 = 1,//拼接token,再跳转url
};
@interface WebViewController : UIViewController
- (instancetype)initWithPowerType:(PowerType)powerType URL:(NSString *)url token:(NSString*)token;
@end
@interface CEGWebViewController ()
@property (copy ,nonatomic) NSString *urlStr;
@property (assign ,nonatomic) PowerType powerType;
@property (copy ,nonatomic) NSString *token;
@end
@implementation WebViewController
- (instancetype)initWithPowerType:(PowerType)powerType URL:(NSString *)url token:(NSString*)token {
if (self = [super init]) {
self.powerType = powerType;
self.urlStr = url;
self.token = token;
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
switch (self.powerType) {
case Power_Type_0:
//直接用url请求网页
break;
case Power_Type_1:
//用url拼接token后再加载网页
break;
default:
break;
}
}
@end
下面用swift的枚举关联值重写上面的场景
enum PowerType {
case directload(String)
case joinToken(String, String)
}
class WebViewController: UIViewController {
let powerType: PowerType!
init(powerType: PowerType) {
self.powerType = powerType
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
switch self.powerType {
case .directload(let url):
//直接用url请求网页
break
case .joinToken(let url, let token):
//用url拼接token后再加载网页
break
case .none: break
}
}
}
个人理解关联值,即跟此枚举类型相关的参数,都可以绑定到枚举类型上,方便操作,不用在类一堆的属性上来进行操作,结构清晰!