我的代码中有一行被否决了,在XCode中有一些建议用什么来替换它,但是我无法理解它们之间的区别,这是我的三行代码起作用的:
let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData.dataWithContentsOfMappedFile(path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef
现在,根据警告和建议,我将代码更改为:
let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData(contentsOfFile: path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef
这给了我一个错误:
EXC_BAD_INSTRUCTION (CODE=EXC_I386_INVOP SUBCODE=0x0)
发布于 2018-02-03 04:47:17
然而,在Swift 4中,您应该这样做:
当两个选项放在相同的NSData
子句中时,Xcode 9.2似乎自动将Data
视为guard-let
。我必须把这两个选项放在单独的guard-let
条款中,如下所示:
// guard let url = Bundle.main.url(forResource: "example", withExtension: ".p12"),
// let data = NSData(contentsOf: url) else {
// return
// }
guard let url = Bundle.main.url(forResource: "example", withExtension: ".p12") else {
return
}
guard let data = NSData(contentsOf: url) else {
return
}
let bytes = data.bytes.assumingMemoryBound(to: UInt8.self)
let cfData = CFDataCreate(kCFAllocatorDefault, bytes, data.length) // CFData object you want
发布于 2015-11-19 03:46:20
@Abizern的答案有效,但使用CFDataCreateWithBytesNoCopy
而不是CFDataCreate
更有效。
https://stackoverflow.com/questions/32883266
复制相似问题