错误:在Swift 3中对成员'下标'的引用不明确

我下载了Xcode 8 beta,并把我的语法转换成了Swift 3.当我这样做的时候,我得到了与这个代码同名的错误(这在之前没有发生过):

Swift 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") } 

Swift 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中的错误,还是我错过了一些东西?

我知道有相同的错误有很多问题,但这些不能解决我的问题。 我很高兴编辑澄清。

提前致谢!

我认为这样的事情应该工作:

 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只是一个常量string,我用原始值replace了它。 这看起来没问题 – 但最好是find官方的等价物(当然,我现在还没有设法解决,所以不要把这个解决scheme当成是理所当然的,这只是一个解决方法)。

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) } 

这在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()

通过selectSwift中的选项来检查它们的返回数据types是很容易的。

这可以在从调用返回的词典上工作:

 fileAttributes[FileAttributeKey.size.rawValue] 

(Swift 3截至XCode8 WWDC)