【问题标题】:Looping through a CFArray of CFURL循环通过 CFURL 的 CFArray
【发布时间】:2019-06-24 22:13:21
【问题描述】:

使用 Swift,我正在尝试遍历 CFURL 的 CFArray,但我收到了 EXC_BAD_INSTRUCTION 错误。

let apps = LSCopyApplicationURLsForURL(NSURL(string: "http://www.yahoo.com")! as CFURL, LSRolesMask.all)!

let finalArray = apps.takeRetainedValue()

let count = CFArrayGetCount(finalArray)

for ix in 0...count-1 {
    let url = CFArrayGetValueAtIndex(finalArray, ix) as! CFURL
    print(url)
}

我做错了什么?

【问题讨论】:

    标签: swift core-services


    【解决方案1】:

    你真的想留在 CoreFoundation 的深渊吗? ? 将数组转换为[URL]

    if let apps = LSCopyApplicationURLsForURL(URL(string: "http://www.yahoo.com")! as CFURL, LSRolesMask.all)?.takeRetainedValue() {
        for url in apps as! [URL] {
            print(url)
        }
    }
    

    顺便说一句,发生错误是因为CFArrayGetValueAtIndex返回一个不能转换为CFURL的指针

    你必须写类似的东西

    for ix in 0..<count {
        let url = unsafeBitCast(CFArrayGetValueAtIndex(finalArray, ix), to: URL.self)
        print(url)
    }
    

    【讨论】:

    • 感谢您展示如何正确地将数组转换为 [URL],这看起来好多了。
    【解决方案2】:

    你需要做的就是:

    let urls = cfArr as? Array<URL>
    

    样本:

    if let retainedArr = LSCopyApplicationURLsForURL(URL(fileURLWithPath: "/Users/uks/Desktop/taopixie4.png") as CFURL, .all)?.takeRetainedValue(),
    
    let listOfRelatedApps = retainedArr as? Array<URL>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多