当我迁移到Swift时,我将Objective-C片段转换为Swift。我还是Objective-C的新手,我对Swift有一般的了解。有问题满足参数C char尝试从Int8转换为C Char。
class func computeSHA256Digest(for input: String?) -> String? {
let cstr = Int8(input?.cString(using: .utf8) ?? 0)
/* the rest of code */
}
无法转换类型' Int'预期的论证类型' [CChar]' (又名数组)
答案 0 :(得分:2)
问题是0
之后的??
。表达式input?.cString(using: .utf8)
返回[CChar]?
,因此如果结果为??
,则使用nil
提供默认值时,需要提供相同类型的值。您需要[CChar]
,但是您传递0
,当然是Int
。
然后由于某种原因,您尝试从生成的Int8
创建[CChar]
。那不行,所以你需要解释为什么要这样做。
另一个考虑因素是您的input
参数是可选的,返回值是可选的。如果input
为nil
,您应该返回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
}
如果guard
为nil
,input
只会返回nil
。在guard
之后,有一个名为input
的局部变量不是可选的,因此您可以直接获取其cString
值。强制解包cString
的结果是安全的,因为您永远不会使用nil
编码获得.utf8
。
此时,cstr
的类型为[CChar]
。