Swift Switch 语句无法匹配字符串:这可能是什么原因造成的?

Swift Switch statement fails to match strings: What could cause this?

我有一些代码可以根据 machine ID 确定 Apple Watch 的系列。在我能够在真正的 Apple Watch 上进行的所有测试中,它按预期工作。

然而,一旦出现,它在某些情况下无法匹配,并退回到 default 的情况。我在 default 中添加了一些日志记录,以显示在匹配失败时传入的 model 值,以查看是否有意外值被传递到函数中。

令我惊讶的是,传入的值似乎匹配,但它仍然符合默认情况。例如 Watch3,4 经常被记录为传入的 model 的值,这应该与生成 Series 3 的情况相匹配,并且在我的测试中确实如此,但出于某种原因,它在我的应用程序发布后并不总是匹配。这里的许多其他模型字符串也是如此。

我是不是好像漏掉了什么?就像其他不可见字符出现在我正在检查的字符串中的可能性一样?或者我遗漏了 switch 语句在 Swift 中的工作方式?

需要说明的是,它并非总是失败。它大部分时间都有效,但有时会失败,即使日志记录显示传入的值是与非默认情况匹配的预期值。

这是我的代码,减去用于诊断的日志记录:

import Foundation

func getWatchModel() -> String? {
    var size: size_t = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = CChar()
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String(cString: &machine, encoding: String.Encoding.utf8)
}

func getSeries(model: String) -> String {
    switch model {
    case "Watch2,3", "Watch2,4":
        return "Series 2"
    case "Watch2,6", "Watch2,7":
        return "Series 1"
    case "Watch3,1", "Watch3,2", "Watch3,3", "Watch3,4":
        return "Series 3"
    case "Watch4,1", "Watch4,2", "Watch4,3", "Watch4,4":
        return "Series 4"
    case "Watch5,1", "Watch5,2", "Watch5,3", "Watch5,4":
        return "Series 5"
    default:
        return "Unknown Series"
    }
}

let series: String?

if let model = getWatchModel() {
    series = getSeries(model: model)
} else {
    series = nil
}

print(series ?? "Apple Watch machine ID could not be determined")

我怀疑问题实际上出在您的 getWatchModel 方法中,特别是在行中:

var machine = CChar()

这分配了一个字节。您需要分配 size 字节。 这是一种方法:

    func getWatchModel() -> String? {
        var size: size_t = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0, count: size)
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        return String(cString: machine, encoding: .utf8)
    }

我怀疑这会导致 String 包含垃圾。我真的很惊讶你没有看到任何崩溃。