无法将类型 'inout NSNumber?' 的值转换为预期的参数类型 'AutoreleasingUnsafeMutablePointer<AnyObject?>' 错误

Cannot convert value of type 'inout NSNumber?' to expected argument type 'AutoreleasingUnsafeMutablePointer<AnyObject?>' error

我有此脚本用于检查从 iCloud 下载的 * 文件是否可用。但不幸的是,我在某些代码行中遇到了错误Cannot convert value of type 'inout NSNumber?' to expected argument type 'AutoreleasingUnsafeMutablePointer<AnyObject?>'。请帮助我解决这个问题,因为这是我第一次创建代码来检查下载的文件是否在icloud中可用。

请参考下图作为错误示例,下面还有代码供您参考。希望你能帮助我。谢谢。

Sample screenshot of error

 //-------------------------------------------------------------------
// ダウンロードできるか判定 Judgment or can be downloaded
//-------------------------------------------------------------------

func downloadFileIfNotAvailable(_ file: URL?) -> Bool {
    var isIniCloud: NSNumber? = nil
    do {
        try (file as NSURL?)?.getResourceValue(&isIniCloud, forKey: .isUbiquitousItemKey)

        if try (file as NSURL?)?.getResourceValue(&isIniCloud, forKey: .isUbiquitousItemKey) != nil {
            if isIniCloud?.boolValue ?? false {
                var isDownloaded: NSNumber? = nil
                if try (file as NSURL?)?.getResourceValue(&isDownloaded, forKey: .ubiquitousItemIsDownloadedKey) != nil {
                    if isDownloaded?.boolValue ?? false {
                        return true
                    }
                    performSelector(inBackground: #selector(startDownLoad(_:)), with: file)
                    return false
                }
            }
        }
    } catch {
    }
    return true
}

您似乎复制并粘贴了一些非常旧的代码。另外,这是Swift,不是Objective-C。不要使用 NSURL 或 getResourceValue。您的代码应该更像这样:

    if let rv = try file?.resourceValues(forKeys: [.isUbiquitousItemKey]) {
        if let isInCloud = rv.isUbiquitousItem {
            // and so on
        }
    }

等等;相同的模式适用于其他键。请注意,也没有 .ubiquitousItemIsDownloadKey 。你可以这样压缩:

    if let rv = try file?.resourceValues(
        forKeys: [.isUbiquitousItemKey, .ubiquitousItemDownloadingStatusKey]) {
            if let isInCloud = rv.isUbiquitousItem {
                if let status = rv.ubiquitousItemDownloadingStatus {
                    if status == .downloaded {

                    }
                }
            }
    }