通常,switch-case语句的工作方式如下:如果条件与值完全匹配,则执行相应的代码块。但就我而言,出了点问题!为什么条件为“ date”时,为什么“ update”代码对我有用!?我试图重现操场上的情况-那里的一切正常。有什么问题吗?
update
为何key = "date"
块起作用?从理论上讲,default
块应该可以工作!?
我的代码:
print("Dictionary = \(dictionary)")
for (key, value) in dictionary {
switch key {
case BaseDatabase.COLUMN_ID:
// My code
case WeddingDatabase.COLUMN_PREMIUM:
// My code
case BaseDatabase.COLUMN_UPDATE_CLEAN:
print("type = \(BaseDatabase.COLUMN_UPDATE_CLEAN), key = \(key)")
// My code
default:
// My default code
}
}
我的控制台:
dictionary = ["note": <null>, "date": 2024-08-08 00:00:00, "update": 2019-07-09 08:57:05, "id_wedding": 1]
type = update, key = date // WHY??
type = update, key = update
更新:
将代码剪切为平庸:
let key = "date"
switch key {
case "update":
print("key = \(key)")
break
default:
print("default = \(key)")
break
}
在viewDidLoad
空viewController中添加了代码。控制台仍显示key = date
。我仅在我的项目中看到问题。我试图在新项目和playgroud中添加代码-一切正常(default = date
输出到控制台)。怎么会这样?我尝试了不同的模拟器(和iOS版本)-问题仍然存在。我也尝试清理项目-问题仍然存在。也许在项目中的某处重新定义了switch语句的工作-这可能吗?
答案 0 :(得分:2)
我发现了一个问题。在String类扩展中,〜=运算符的重新定义如下:
extension String {
static func ~= (lhs: String, rhs: String) -> Bool {
return NSRegularExpression(rhs).matches(lhs)
}
}
事实证明,~=
语句中使用了switch
运算符。
为了更正错误,我用以下内容替换了该扩展名:
extension String {
func matches(pattern: String) -> Bool {
return NSRegularExpression(pattern).matches(self)
}
}
我如何使用它:
if value.matches(pattern: "#[0-9]{1,2}[A-Z]#" {
// Code
}
重新定义运算符时应该非常细心!