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

问题描述 投票:-1回答:1

我有一些代码可以根据其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")
swift switch-statement watchkit apple-watch
1个回答
1
投票

我怀疑问题实际上出在您的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包含垃圾。我真的很惊讶您没有看到任何崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.