将[byte]?转换为[byte]

3

你好,我是一名新手,正在尝试解码以 [Byte] 形式发送回来的字节数组。当我尝试使用

Swift时,遇到了问题。

if let string = String(bytes: d, encoding: .utf8) {
    print(string)
} else {
    print("not a valid UTF-8 sequence")
}

它说需要解包。我无法更改返回可选数组的基础代码,因为它是从框架返回的。


4
如果有可选变量 d,则将其转换为 bytes 数组并使用 UTF-8 编码转换为字符串 string。这是一个使用可选绑定的嵌套 if 语句,第一个 if 用于解包 d,如果成功则执行第二个 if 语句中的代码块。可以将原始代码简化为 if let bytes = d, let string = String(bytes: bytes, encoding: .utf8) {},也可以展开为两个嵌套的 if 语句:if let bytes = d { if let string = String(bytes: bytes, encoding: .utf8) {} } - Larme
干杯,我找了一下,但不知道我真正在寻找什么。尝试使用flatMap,但让我感到困惑。 - Jordan
如果数组中的每个元素都是可选项,则应使用 flatMap(),例如 [Byte?]。但是现在您有一个可选的数组 [Byte]? - Larme
2个回答

4
使用 guard let
guard let unwrappedBytes = d else { return }

使用此方法,您将获得与以前完全相同的数据,但没有问号。

我知道在Swift中理解可选项可能很困难。我建议查看苹果文档,这些文档非常好: https://developer.apple.com/documentation/swift/optional


1
一开始你讨厌可选项,然后你就离不开它们了 :) - J. Doe

-3

[Byte]?表示这是一个可选数组。问号“?”在此处表示选项符号。

可选变量可能有值,也可能没有,这意味着返回的变量的可能值为空。请参阅参考链接:https://cocoacasts.com/what-is-an-optional-in-swift

将您的代码更改为:

if let string = String(bytes: d!, encoding: .utf8) {
                print(string)
            } else {
                print("not a valid UTF-8 sequence")
            }
} 

我已经将符号!与d放在一起。这是使用Swift中的可选解包的一种方式。


3
不建议使用感叹号,因为这可能会导致应用程序在可选项为 nil 时崩溃。 - Ling Vu
是的,我同意你的看法,Ling。但是我只是解释了一种展开值的方法。安全展开更有用,可以防止崩溃。 - Avtar Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接