加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:41:17 所属栏目:百科 来源:网络整理
导读:好吧,这是我在使用CG ImageSource时遇到的情况,并注意到CFDictionary和NSDictionary之间的免费桥接在某些情况下似乎遇到了问题.我已设法构建以下示例以显示我的意思: func optionalProblemDictionary() - CFDictionary? { let key = "key" let value = "val
好吧,这是我在使用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
}

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

以下为什么不工作?

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

虽然这很好吗?

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

XCode 7.0(7A220)

解决方法

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

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

let cfString = "foobar" as CFString?

if let s1 = cfString as? NSString {
    print("s1 = (s1)") // not executed
}

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

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

if let s2 = cfString as NSString? {
    print("s2 = (s2)") // prints "s2 = foobar"
}

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

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

然后执行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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读