Error: Ambiguous reference to member 'subscript' in Swift 3

Error: Ambiguous reference to member 'subscript' in 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 只是一个常量字符串,所以我用它的原始值替换了它。看起来不错 - 但当然最好找到官方的等价物(我现在没能做到,所以不要认为这个解决方案是理所当然的,它只是一种解决方法)。

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

通过在 Swift 中单击选项检查它们,很容易发现它们的 return 数据类型。

这适用于调用返回的词典:

fileAttributes[FileAttributeKey.size.rawValue]

(Swift 3 截至 XCode8 WWDC)