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)
我下载了 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)