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



我有一些代码可以根据机器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包含垃圾。我真的很惊讶你没有看到任何崩溃。

相关内容

  • 没有找到相关文章