NSURL getResourceValue dans swift
avoir de la difficulté à comprendre comment faire l'appel suivant dans swift:
var anyError: NSError? = nil
var rsrc: NSNumber? = nil
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
Le ci-dessus ne compile pas:
Cannot convert the expression's type 'Bool' to type 'inout Bool'
j'ai Donc essayé ceci:
var anyError: NSError? = nil
var rsrc: AutoreleasingUnsafePointer<AnyObject?> = nil
var success = url.getResourceValue(rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
mais cela génère EXC_BAD_ACCESS
erreur d'exécution.
Comment puis-je passer dans le premier arg AutoreleasingUnsafePointer<AnyObject?>
(qui devrait pointer vers un nombre booléen NSN selon doc), et ensuite être en mesure de vérifier sa valeur Bool attendue ?
5 réponses
Vous avez besoin de faire rsrc
une option AnyObject et de les passer par référence comme suit:
var anyError: NSError?
var rsrc: AnyObject?
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError)
Remarque:: Vous n'avez pas besoin d'initialiser les Options à zéro, ils sont mis à zéro par défaut.
Si vous souhaitez ensuite de vérifier si la valeur est une NSNumber vous pouvez ensuite faire une conversion:
if let number = rsrc as? NSNumber {
// use number
}
voici le code de drewag mis à jour pour Swift 2.0
do {
var rsrc: AnyObject?
try element.getResourceValue(&rsrc, forKey: NSURLIsDirectoryKey)
if let number = rsrc as? NSNumber {
if number == true {
// do something
}
}
} catch {
}
dans swift 3 les appels précédents ne sont pas disponibles/dépréciés:
utilisation:
var keys = Set<URLResourceKey>()
keys.insert(URLResourceKey.isDirectoryKey)
do{
let URLResourceValues = try fileURL.resourceValues(forKeys: keys)
}catch _{
}
si le résultat de getResourceValue(:forKey:) est finalement une valeur logique, vous pouvez lancer directement le pointeur retourné à une valeur Bool:
let boolResult = rsrc as! Bool
ou tout simplement le tester aussi une valeur Booléenne sans affectation:
if rsrc as! Bool {
// true code
} else {
// false code
}
ou faire les deux:
if let rsrc as! Bool {
// true
} else {
// false
}
voici un exemple concret d'extension du type D'URL:
extension URL {
var creationDate : Date {
let url = self as NSURL
var value : AnyObject?
try? url.getResourceValue(&value, forKey: .creationDateKey)
if let date = value as? Date {
return date
}
return .distantPast
}
}
Pour plus de commodité, si l'appel à getResourceValue()
échoue, elle renvoie la valeur .distantPast
par défaut. À l'aide de la try?
permet de rejeter l'erreur qui n'est pas toujours nécessaire.