我有一些代码可以根据其machine ID确定Apple Watch的系列。在所有我可以在真正的Apple Watch上进行的测试中,它都能按预期工作。
但是,一旦出现异常,在某些情况下将无法匹配,并会退回到default
情况。我在default
中添加了一些日志记录,以查看model
值在不匹配时传递的值,以查看是否有意外值传递到函数中。
令我惊讶的是,传入的值似乎匹配,但仍达到默认情况。例如,Watch3,4
经常被记录为传入的model
的值,该值应匹配大小写以生成Series 3,并且在我的测试中也是如此,但是由于某些原因,它并不总是与in我的应用一旦发布。这里的许多其他模型字符串也是如此。
好像我在这里缺少什么吗?就像其他不可见字符以我正在检查的字符串结尾的可能性一样吗?还是我在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
包含垃圾。我真的很惊讶您没有看到任何崩溃。