Swift中的奇怪行为切换案例语句

时间:2019-07-09 12:47:37

标签: swift switch-statement

通常,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语句的工作-这可能吗?

1 个答案:

答案 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
}

重新定义运算符时应该非常细心!