[英]Strange behavior switch-case statement in Swift
通常,switch-case語句的工作方式如下:如果條件與值完全匹配,則執行相應的代碼塊。 但就我而言,出了點問題! 為什么條件為“ date”時,為什么“ update”代碼對我有用!? 我試圖重現操場上的情況-那里的一切正常。 問題是什么?
為什么key = "date"
時update
塊起作用? 從理論上講, 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語句的工作-這可能嗎?
我發現了一個問題。 在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
}
重新定義操作員時,應格外注意!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.