首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >把NSData当演员!迅捷2.0中的CFDataRef

把NSData当演员!迅捷2.0中的CFDataRef
EN

Stack Overflow用户
提问于 2015-10-01 08:50:55
回答 2查看 8.3K关注 0票数 5

我的代码中有一行被否决了,在XCode中有一些建议用什么来替换它,但是我无法理解它们之间的区别,这是我的三行代码起作用的:

代码语言:javascript
运行
复制
let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData.dataWithContentsOfMappedFile(path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef

现在,根据警告和建议,我将代码更改为:

代码语言:javascript
运行
复制
let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData(contentsOfFile: path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef

这给了我一个错误:

代码语言:javascript
运行
复制
EXC_BAD_INSTRUCTION (CODE=EXC_I386_INVOP SUBCODE=0x0)
EN

回答 2

Stack Overflow用户

发布于 2018-02-03 04:47:17

然而,在Swift 4中,您应该这样做:

当两个选项放在相同的NSData子句中时,Xcode 9.2似乎自动将Data视为guard-let。我必须把这两个选项放在单独的guard-let条款中,如下所示:

代码语言:javascript
运行
复制
//        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
票数 6
EN

Stack Overflow用户

发布于 2015-11-19 03:46:20

@Abizern的答案有效,但使用CFDataCreateWithBytesNoCopy而不是CFDataCreate更有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32883266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档