it-swarm.com.ru

Ошибка: неоднозначная ссылка на элемент «индекс» в Swift 3

Я скачал бета-версию Xcode 8 и преобразовал свой синтаксис в Swift 3. Когда я это сделал, я получил одноименную ошибку с этим кодом (такого раньше не было):

Свифт 3:

do {
    let fileAttributes = try FileManager.default().attributesOfItem(atPath: fileURL.path!) // Error here
    let fileSizeNumber = fileAttributes[NSFileSize] as! NSNumber
    fileSize = fileSizeNumber.longLongValue
} catch _ as NSError {
    print("Filesize reading failed")
}

Свифт 2:

do {
    let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(fileURL.path!)
    let fileSizeNumber = fileAttributes[NSFileSize] as! NSNumber
    fileSize = fileSizeNumber.longLongValue
} catch _ as NSError {
    print("Filesize reading failed")
}

Это ошибка в Swift 3 или я что-то упустил?

Я знаю, что есть много вопросов об этой ошибке, но они не решают мою проблему. Я рад отредактировать для уточнения.

Заранее спасибо!

4
atirit

Я думаю, что-то вроде этого должно работать:

do {
    let fileAttributes = try FileManager.default().attributesOfItem(atPath: file.path!)
    if let fileSizeNumber = fileAttributes["NSFileSize"] as? NSNumber {
        let fileSize = fileSizeNumber.int64Value

    }
} catch let error as NSError {
    print("Filesize reading failed: \(error.debugDescription)")
}

Поскольку NSFileSize была просто константной строкой, я заменил ее необработанным значением. Кажется, все в порядке - но, конечно, было бы лучше найти официальный эквивалент (чего мне пока не удавалось, так что не принимайте это решение как должное, это просто обходной путь).

Обновление для Xcode 8 GM:

Использование FileAttributeKey.size лучше, чем использование жестко закодированной константы (спасибо @ rudy за напоминание). Вот обновленный пример:

do {
    let attributes = try FileManager.default.attributesOfItem(atPath: file.path)
    if let size = attributes[FileAttributeKey.size] as? NSNumber {
        let fileSize = size.int64Value
        print(fileSize)
    }
} catch {
    print(error.localizedDescription)
}
7
ayaio

Это работает в словаре, как вернулся из вызова:

fileAttributes[FileAttributeKey.size.rawValue]

(Swift 3 от XCode8 WWDC)

1
Bjoern Kriews

Это работает в Swift 3:

var fileSize: UInt64 // size in bytes

do {
    let fileAttributes: NSDictionary? = try FileManager.default().attributesOfItem(atPath: fileURL.path!)
    if let fileSizeNumber = fileAttributes?.fileSize() { fileSize = fileSizeNumber }
} catch let error as NSError {
    print("Filesize reading failed: \(error.debugDescription)")
}

Приведя атрибуты в NSDictionary, становятся доступны многие встроенные методы, включая .fileSize ():

  • .fileGroupOwnerAccountName()
  • .fileModificationDate()
  • .fileOwnerAccountName()
  • .filePosixPermissions()
  • .fileSize()
  • .fileSystemFileNumber()
  • .fileSystemNumber()
  • .fileType()

Обнаружить их возвращаемые типы данных легко, проверив их с помощью Option-Click в Swift.

1
stef