2014-08-29 22 views
22
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'errore di compilazione è qui sotto:Tipo 'ANYOBJECT' non è conforme al protocollo 'SequenceType'

Tipo 'ANYOBJECT' non è conforme al protocollo 'SequenceType'

cosa fa questo?

chi può aiutarmi, molto !!!!

risposta

42

di Apple stati in The Swift Programming Language:

Il per-in loop esegue una serie di istruzioni per ogni elemento in un intervallo, sequenza, raccolta, o la progressione.

In questo momento, directoryContent è solo conforme al protocollo AnyObject, quindi non è possibile utilizzare per i loop su di esso. Se si vuole fare in modo, si deve fare qualcosa di simile a quanto segue:

for item in directoryContent as [AnyObject] { 
    //Do stuff 
} 
+0

thks molto, l'aggiornamento da beta3 a beta6, appaiono molti nuovi error.it compilazione sembra progetto molti github necessità di ricostruire per Xcode-beta6 , qualche buon consiglio per me? –

+0

bravo, ha funzionato per me in Swift 2 – Naishta

4

contentsOfDirectoryAtPath restituisce un NSArray, mentre si sta casting a AnyObject. La soluzione è quella di lanciarlo a uno [AnyObject]? o NSArray:

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

o

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

Quindi utilizzare un legame opzionale prima del ciclo for:

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

Guardando la documentazione contentsOfDirectoryAtPath, afferma che restituisce sempre un array, quindi quanto detto sopra può essere ridotto a scartare il valore restituito a un array rapido o objc, con nessuna necessità di utilizzare l'opzione vincolante:

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

o

let directoryContent: NSArray = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)! 
Problemi correlati