前言
今天在学习swift的枚举(enum)类型时,发现了一个奇怪的问题,先上code才方便说明:
import UIKit
//定义了一个枚举类型
enum Names {
case XiaoMing
case ZhangSan
case Lisi
case WangWu
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let who = Names.ZhangSan
//我们发现,who这里发生了一个warning:switch condition evaluates to a constant.
switch who {
case .XiaoMing:
print("he is XiaoMing")
case .ZhangSan:
print("he is ZhangSan")
case .Lisi:
print("he is Lisi")
default:
print("he is WangWu")
}
}
}
警告:
从上面的完整code我们知道,很多人都会认为没有任何的问题,的确,编译和运行都成功通过,打印结果:
he is ZhangSan
但是,对于一个有十分严重的强迫症的人来说,这是很难容忍的,于是我花了近一个小时去了解这个warning产生的reason,不幸的是,我并没有找到或者说理解这到底是什么原因,幸运的是,我解决了这个warning的问题,再上code,看看和刚才的区别:
import UIKit
enum Names {
case XiaoMing
case ZhangSan
case Lisi
case WangWu
}
let who = Names.ZhangSan
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
switch who {
case .XiaoMing:
print("he is XiaoMing")
case .ZhangSan:
print("he is ZhangSan")
case .Lisi:
print("he is Lisi")
default:
print("he is WangWu")
}
}
}
然后,warning就没有了。
why?
但把 let who = Names.ZhangSan 设置为全局之后就没有了警告,可以当设置为局部变量时就产生了警告,虽然后面是解决了,但我心里还是蛮郁闷的,后续有时间,再深究一下为什么要设置为全局?为什么不能设置为局部?虽然局部的时候也可以编译和运行成功,但要对于追求完美的人来说,这是心里的一个疙瘩。