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



我下载了xcode 8 beta,然后将我的语法转换为swift3。当我这样做时,我在此代码中遇到了同名错误(以前没有发生这种错误):

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中使用选件单击检查它们的返回数据类型很容易发现它们。

这在呼叫中返回的字典上起作用:

fileAttributes[FileAttributeKey.size.rawValue]

(如Xcode8 WWDC所示)

最新更新