Не удается преобразовать значение типа 'inout NSNumber?' к ожидаемому типу аргумента 'AutoreleasingUnsafeMutablePointer ' ошибка - PullRequest
0 голосов
/ 22 января 2020

У меня есть этот скрипт, чтобы проверить, доступен ли * загруженный файл из iCloud или нет. Но, к сожалению, я столкнулся с ошибкой Cannot convert value of type 'inout NSNumber?' to expected argument type 'AutoreleasingUnsafeMutablePointer<AnyObject?>' в некоторых строках кода. Пожалуйста, помогите мне решить эту проблему, потому что я впервые создаю код, чтобы проверить, доступен ли загруженный файл в icloud или нет.

См. Изображение ниже как пример ошибки, а также коды доступны ниже для вашей справки. Надеюсь, вы могли бы помочь мне. Спасибо.

Пример скриншота ошибки

 //-------------------------------------------------------------------
// ダウンロードできるか判定 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
}

1 Ответ

0 голосов
/ 22 января 2020

Похоже, вы скопировали и вставили действительно старый код. Кроме того, это 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 {

                    }
                }
            }
    }
...