web-dev-qa-db-fra.com

Le type 'AnyObject' n'est pas conforme au protocole 'SequenceType'

func loadThumbnails() {

    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory:NSString = paths[0] as NSString
    var error:NSError?
    let fileManager = NSFileManager()
    let directoryContent:AnyObject = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)!

    thumbnails = [QSPhotoInfo]()

    for item:AnyObject in directoryContent {
        let fileName = item as NSString
        if fileName.hasPrefix(kThumbnailImagePrefix) {
            let image = loadImageFromDocumentsDirectory(fileName)
            var photoInfo = QSPhotoInfo()
            photoInfo.thumbnail = image;
            photoInfo.thumbnailFileName = fileName
            thumbnails += photoInfo
        }
    }
}

l'erreur de compilation est ci-dessous:

Le type 'AnyObject' n'est pas conforme au protocole 'SequenceType'

qu'est-ce que cela menas?

qui peut m'aider, merci beaucoup !!!!

23
chris wang

Apple déclare dans Le Swift :

La boucle for-in effectue un ensemble d'instructions pour chaque élément dans une plage, une séquence, une collection ou une progression.

Pour l'instant, directoryContent est juste conforme au protocole AnyObject, vous ne pouvez donc pas l'utiliser pour les boucles. Si vous le souhaitez, vous devez faire quelque chose de similaire à ce qui suit:

for item in directoryContent as [AnyObject] {
    //Do stuff
}
46
Imanou Petit

contentsOfDirectoryAtPath renvoie un NSArray, tandis que vous le transformez en AnyObject. La solution consiste à le convertir en [AnyObject]? ou NSArray:

let directoryContent: [AnyObject]? = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)

ou

let directoryContent: NSArray? = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)

Utilisez ensuite une liaison facultative avant la boucle for:

if let directoryContent = directoryContent {
    for item:AnyObject in directoryContent {

En regardant la documentation contentsOfDirectoryAtPath, il indique qu'il retourne toujours un tableau - donc ce qui a été dit ci-dessus peut être réduit à déballer la valeur de retour en un Swift ou tableau objc, sans aucun besoin d'utiliser la liaison facultative:

let directoryContent: [AnyObject] = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)!

ou

let directoryContent: NSArray = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)!
4
Antonio