swift

Swift关于对枚举关联值理解

2021-03-16  本文已影响0人  得_道

刚开始很疑惑,为啥枚举要整个关联值出来,用处在什么地方?
经过的学习和思考后有了一点自己理解。
首先,来看一个OC写的枚举的例子。
app跳转一个网页有两种情况:

  1. 直接跳转的形式
  2. 拼接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
        }
    }
}

个人理解关联值,即跟此枚举类型相关的参数,都可以绑定到枚举类型上,方便操作,不用在类一堆的属性上来进行操作,结构清晰!

上一篇 下一篇

猜你喜欢

热点阅读