【问题标题】:Strange behavior switch-case statement in SwiftSwift 中的奇怪行为 switch-case 语句
【发布时间】:2019-07-09 12:47:37
【问题描述】:

switch-case 语句通常是这样工作的:如果条件与值完全匹配,则执行相应的代码块。但就我而言,出了点问题!为什么条件是“日期”时“更新”的代码对我有用!?我试图重现操场上的情况——那里一切正常。有什么问题?

为什么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 空视图控制器中添加代码。控制台仍显示key = date。我只在我的项目中看到问题。我尝试在新项目和游乐场中添加代码 - 一切正常(default = date 输出到控制台)。怎么会这样?我尝试了不同的模拟器(和 iOS 版本) - 问题仍然存在。我还尝试清理项目 - 问题仍然存在。也许在项目的某个地方重新定义了 switch 语句的工作 - 这可能吗?

【问题讨论】:

  • 编译自包含的示例会很有帮助。
  • @martin-r 问题是在独立示例中,我没有观察到这样的问题。一切正常。
  • 你是如何定义BaseDatabase.COLUMN_IDWeddingDatabase.COLUMN_PREMIUMBaseDatabase.COLUMN_UPDATE_CLEAN的?
  • @TheTiger 采用以下方式:static let COLUMN_ID = "_id"static let COLUMN_PREMIUM = "premium"private static let COLUMN_UPDATE_CLEAN = "update"
  • 有几件事:首先,您的更新 2 包含非标准语法(可能依赖于您项目中的其他扩展)。我建议你总是让你的例子尽可能简单。例如。 static func ~= (lhs: String, rhs: String) -&gt; Bool { return lhs.contains(rhs) } 也体现了这个问题。其次,你不应该在你的问题中加入答案,而是post your own answer to your question。我认为这是您发现的真正宝石,但您让别人很难为您的问题投票,更不用说您的答案了。

标签: swift switch-statement


【解决方案1】:

我发现了一个问题。在 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
}

重新定义算子的时候应该很用心!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多