CFDictionary不会桥接到NSDictionary(Swift 2.0iOS9)

CFDictionary不会桥接到NSDictionary(Swift 2.0iOS9),第1张

概述好吧,这是我在使用CG ImageSource时遇到的情况,并注意到CFDictionary和NSDictionary之间的免费桥接在某些情况下似乎遇到了问题.我已设法构建以下示例以显示我的意思: func optionalProblemDictionary() -> CFDictionary? { let key = "key" let value = "value" v 好吧,这是我在使用CG ImageSource时遇到的情况,并注意到CFDictionary和NSDictionary之间的免费桥接在某些情况下似乎遇到了问题.我已设法构建以下示例以显示我的意思:

func optionalProblemDictionary() -> CFDictionary? {    let key = "key"    let value = "value"    var keyCallBacks = CFDictionaryKeyCallBacks()    var valueCallBacks = CFDictionaryValueCallBacks()    let cfDictionary = CFDictionaryCreate(kcfAllocatorDefault,UnsafeMutablePointer(unsafeAddressOf(key)),UnsafeMutablePointer(unsafeAddressOf(value)),1,&keyCallBacks,&valueCallBacks)    return cfDictionary}@H_403_12@  

相当简单(有点傻)但它的功能返回和可选的CFDictionary.尝试从此函数创建NSDictionary时,“fun”开始:

以下为什么不工作?

if let problemDictionary = optionalProblemDictionary() as? NSDictionary {    print(problemDictionary) // never enters,no warnings,compiles just fine}@H_403_12@  

虽然这很好吗?

if let cfDictionary = optionalProblemDictionary() {    let problemDictionary = cfDictionary as NSDictionary    print(problemDictionary)}@H_403_12@  

XCode 7.0(7A220)

解决方法 原因似乎是函数返回一个可选项
CFDictionary?并且不能强制转换为(非可选)
的NSDictionary.

这是一个更简单的示例,演示了与CFString和Nsstring相同的问题:

let cfString = "foobar" as CFString?if let s1 = cfString as? Nsstring {    print("s1 = \(s1)") // not executed}@H_403_12@  

(问题仍然是为什么这不会给编译器错误或
至少编译器警告,因为这个可选的强制转换可以
永远不会成功.)

但是对可选的Nsstring进行转换?作品:

if let s2 = cfString as Nsstring? {    print("s2 = \(s2)") // prints "s2 = foobar"}@H_403_12@  

在您的情况下,如果您将“有问题的案例”更改为

if let problemDictionary = cfDict as NSDictionary? {    print(problemDictionary)}@H_403_12@  

然后执行if-block.

请注意,在Swift中构建CFDictionary的方法不正确
并在我的测试中实际导致程序崩溃.一个原因是
字典回调设置为空结构.
另一个问题是unsafeAddressOf(key)桥接了Swift
字符串到Nsstring,可以立即解除分配.

我不知道在Swift中构建CFDictionary的最佳方法是什么,
但这在我的测试中起作用:

func optionalProblemDictionary() -> CFDictionary? {    let key = "key" as Nsstring     let value = "value" as Nsstring    var keys = [ unsafeAddressOf(key) ]    var values = [ unsafeAddressOf(value) ]    var keyCallBacks = kcfTypeDictionaryKeyCallBacks    var valueCallBacks = kcfTypeDictionaryValueCallBacks    let cfDictionary = CFDictionaryCreate(kcfAllocatorDefault,&keys,&values,&valueCallBacks)    return cfDictionary}@H_403_12@                            	          总结       

以上是内存溢出为你收集整理的CFDictionary不会桥接到NSDictionary(Swift 2.0 / iOS9)全部内容,希望文章能够帮你解决CFDictionary不会桥接到NSDictionary(Swift 2.0 / iOS9)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1007090.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存