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 ?

15
demandé sur CMont 2014-06-25 08:36:36

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
}
28
répondu drewag 2014-06-25 04:40:17

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 {
    }
7
répondu Eli Burke 2016-01-08 17:48:31

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 _{

   }
5
répondu ingconti 2016-09-30 15:53:21

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
}
0
répondu Pinecone 2016-07-01 22:27:36

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.

0
répondu Patrick Beard 2018-08-08 01:20:16