【问题标题】:Swift Extension for [UInt8][UInt8] 的 Swift 扩展
【发布时间】:2021-08-30 13:13:24
【问题描述】:

这类似于here 之前提出的问题。

然而,在该问题的答案中,建议从 Swift 3.1 开始,应该可以使用 Array where 语法扩展特定类型。

我正在尝试使用 Array where 进行扩展,以将我的字节数组转换为 Ascii 字符串,如下所示:

extension Array where Element == UInt8 {

public static func ToAsciiString() -> String {
    if let result = String(bytes: self, encoding: .ascii) {
        return result
    }
    else
    {
        // TODO: Something more appropriate like throwing an error?
        return "ERROR"
    }
}
}

但是,这会产生两个编译器错误,并显示以下消息:

Initializer 'init(bytes:encoding:)' 要求类型 'Array.Type.Element' 和 'UInt8' 等价

类型'Array.Type'不能符合'Sequence'

有可能做我想做的事吗?如果是这样,有人可以指出我哪里出错了吗?

【问题讨论】:

  • 删除static?是错字吗?
  • 更多的是复制/粘贴失败而不是拼写错误 - 在我尝试将其修改为扩展之前,它开始作为辅助类中的静态方法。

标签: swift


【解决方案1】:

我认为你只是想做这样的事情:

extension Array where Element == UInt8 {
    public func toAsciiString() -> String? {
        String(bytes: self, encoding: .ascii)
    }
}

用法:

let arr: [UInt8] = [97, 98, 99]
if let str = arr.toAsciiString() {
    print(str)
} else {
    print("Error!")
}

打印:

abc

问题在于您将函数标记为static - 这意味着当前实例没有self。删除此static 有效。

在错误处理方面:你可以做一些事情,比如抛出一个错误,但由于只有 一个 'error' 可能发生,我只是认为可选就足够了。然后调用者可以决定如果结果是nil 该怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多