【问题标题】:Cannot convert value of type 'Int' to expected argument type '[CChar]' (aka 'Array<Int8>')无法将“Int”类型的值转换为预期的参数类型“[CChar]”(又名“Array<Int8>”)
【发布时间】:2023-03-24 11:07:01
【问题描述】:

在迁移到 Swift 时,我将 Objective-C sn-p 转换为 Swift。我还是 Objective-C 的新手,我对 Swift 的了解也很一般。满足参数 C char 尝试从 Int8 转换为 C 字符时遇到问题。

class func computeSHA256Digest(for input: String?) -> String? {
    let cstr = Int8(input?.cString(using: .utf8) ?? 0)
    /* the rest of code */
}

无法将“Int”类型的值转换为预期的参数类型“[CChar]”(又名数组)

【问题讨论】:

  • [CChar] 是一个数组,所以不能将 Int 转换为数组

标签: swift char int


【解决方案1】:

问题是?? 之后的0。表达式input?.cString(using: .utf8) 返回[CChar]?,因此当您使用?? 提供默认值时,如果结果为nil,则需要提供相同类型的值。你需要一个[CChar],但你传递的是0,这当然是Int

然后由于某种原因,您试图从生成的[CChar] 创建一个Int8。那是行不通的,所以你需要解释你为什么要这么做。

另一个考虑是你的input参数是可选的,返回值是可选的。也许如果inputnil 你应该只返回nil

我会更改您发布到的代码:

class func computeSHA256Digest(for input: String?) -> String? {
    guard let input = input else { return nil }

    let cstr = input.cString(using: .utf8)!

    // The rest of the code
}

如果inputnil,则guard 只返回nil。在guard 之后有一个名为input 的局部变量不是可选的,因此您可以直接获取它的cString 值。强制解开 cString 的结果是安全的,因为使用 .utf8 编码你永远不会得到 nil

此时,cstr 的类型为 [CChar]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2018-10-02
    • 2019-05-12
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多