2016-08-17 2 views
3

Я пытаюсь преобразовать пример Apple "ShapeEdit" в Swift 3, и я не могу разглядеть его в setResourceValue.Установка значений ресурса URL в Swift 3

компании Apple (Swift 2) пример имеет следующий код:

// Coordinate reading on the source path and writing on the destination path to copy. 
let readIntent = NSFileAccessIntent.readingIntentWithURL(templateURL, options: []) 
let writeIntent = NSFileAccessIntent.writingIntentWithURL(target, options: .ForReplacing) 

NSFileCoordinator().coordinateAccessWithIntents([readIntent, writeIntent], queue: self.coordinationQueue) { error in 
    if error != nil { return } 
    do { 
     try fileManager.copyItemAtURL(readIntent.URL, toURL: writeIntent.URL)  
     try writeIntent.URL.setResourceValue(true, forKey: NSURLHasHiddenExtensionKey)  
     NSOperationQueue.mainQueue().addOperationWithBlock { 
      self.openDocumentAtURL(writeIntent.URL) 
     } 
    } catch { 
     fatalError("Unexpected error during trivial file operations: \(error)") 
    } 
} 

setResourceValue(value: forKey:), кажется, были заменены setResourceValues(), но я не могу установить его. То, что я до сих пор это:

let readIntent = NSFileAccessIntent.readingIntent(with: templateURL, options: []) 
let writeIntent = NSFileAccessIntent.writingIntent(with: target, options: .forReplacing) 

NSFileCoordinator().coordinate(with: [readIntent, writeIntent], queue: self.coordinationQueue) { error in 
    if error != nil { return }     
    do { 
     try fileManager.copyItem(at: readIntent.url, to: writeIntent.url) 
     var resourceValues: URLResourceValues = URLResourceValues.init() 
     resourceValues.hasHiddenExtension = true 
     // *** Error on next line *** 
     try writeIntent.url.setResourceValues(resourceValues) 
     // Cannot use mutating member on immutable value: 'url' is a get-only property 

     OperationQueue.main.addOperation { 
      self.openDocumentAtURL(writeIntent.URL) 
     } 
    } catch { 
     fatalError("Unexpected error during trivial file operations: \(error)") 
    }  
} 

Я не могу найти никаких документов, кроме «переход к определению» Xcode, который говорит

Устанавливает значение ресурса, идентифицированного с помощью данного ключа ресурса.

Этот метод записывает новые значения ресурсов в хранилище резервных копий. Попытки установить свойство ресурса только для чтения или установить свойство ресурса, не поддерживаемое ресурсом, игнорируются и не считаются ошибками. Этот метод в настоящее время применим только к URL-адресам для ресурсов файловой системы.

URLResourceValues отслеживает, какие из его свойств были установлены. Эти значения используются теми, которые используются этой функцией, для определяют, какие свойства писать.

public mutating func setResourceValues(_ values: URLResourceValues) throws

Кто-нибудь есть понимание изменений в setResourceValue(s)?

ответ

6

Текущая декларация NSFileAccessIntent.URL является

public var url: URL { get } 

Это свойство только для чтения.

Поскольку Swift 3 URL - это struct, поэтому вы не можете вызывать методы mutating на неизменяемом значении, которое возвращается от получателя. Чтобы изменить URL, сначала назначьте его var.

var url = intent.URL 
url.setResourceValues(...) 

И затем создайте новое намерение с измененного URL-адреса.

+0

При изучении нового материала, предполагается, что у вас есть ошибка, а не в старых вещах! Вы почти правы, но 'intent.url' по-прежнему доступен только для чтения, поэтому ваша третья строка не работает. Но идея права - повторная инициализация намерения с измененным URL-адресом работает - 'intent = NSFileAccessIntent.writingIntent (с: url, options: .forReplacing)'. Вы хотите обновить ответ, или я должен? – Grimxn

+0

Возможно, вместо этого разместите свой собственный ответ, и я удалю его :) – Sulthan

+0

Нет, вы решили! – Grimxn

4

Принятый ответ полезен, но рабочий код еще лучше

do { 
    var resourceValues = URLResourceValues() 
    resourceValues.isExcludedFromBackup = true 
    try fileUrl.setResourceValues(resourceValues) 
} catch _{ 
} 

Как уже упоминалось @Sulthan, fileURL должен быть изменяемым.

Смежные вопросы