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