ios - programming - Error: referencia ambigua al ''subíndice'' del miembro en Swift 3
xcode for ipad (3)
Esto funciona en 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)")
}
Al convertir los atributos en NSDictionary, muchos métodos incorporados están disponibles, incluido .fileSize ():
-
.fileGroupOwnerAccountName()
-
.fileModificationDate()
-
.fileOwnerAccountName()
-
.filePosixPermissions()
-
.fileSize()
-
.fileSystemFileNumber()
-
.fileSystemNumber()
-
.fileType()
Es fácil descubrir sus tipos de datos de retorno al inspeccionarlos con la opción: haga clic en Swift.
Descargué la versión beta de Xcode 8 y convertí mi sintaxis a Swift 3. Cuando lo hice, obtuve el error del mismo nombre con este código (esto no sucedió antes):
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")
}
¿Es esto un error en Swift 3, o me estoy perdiendo algo?
Sé que hay muchas preguntas sobre el mismo error, pero esas no solucionan mi problema. Me complace editar para aclararme.
¡Gracias por adelantado!
Esto funciona en el Diccionario como se devuelve de la llamada:
fileAttributes[FileAttributeKey.size.rawValue]
(Swift 3 a partir de XCode8 WWDC)
Creo que algo como esto debería funcionar:
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)")
}
Como NSFileSize
era solo una cadena constante, la reemplacé por su valor en bruto. Parece correcto, pero sería mejor encontrar el equivalente oficial, por supuesto (que no pude lograr por ahora, así que no dé por sentada esta solución, es solo una solución).
Actualización para Xcode 8 GM:
Usar FileAttributeKey.size
es mejor que usar la constante codificada (gracias @rudy para el recordatorio). Aquí hay un ejemplo actualizado:
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)
}