Тип 'AnyObject' не соответствует протоколу '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
        }
    }
}

ошибка компиляции ниже:

Тип 'AnyObject' не соответствует протоколу 'SequenceType'

что это менас?

кто может мне помочь, большое спасибо!!!!

2 ответа

Решение

Apple заявляет на языке программирования Swift:

Цикл for-in выполняет набор операторов для каждого элемента в диапазоне, последовательности, коллекции или последовательности.

Прямо сейчас, directoryContent просто соответствует протоколу AnyObject, так что вы не можете использовать для циклов над ним. Если вы хотите сделать это, вы должны сделать что-то похожее на следующее:

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

contentsOfDirectoryAtPath возвращает NSArrayв то время как вы бросаете его AnyObject, Решение состоит в том, чтобы привести его к [AnyObject]? или же NSArray:

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

или же

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

Затем используйте необязательную привязку перед циклом for:

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

Глядя на contentsOfDirectoryAtPath В документации говорится, что он всегда возвращает массив - поэтому сказанное выше может быть сведено к развертыванию возвращаемого значения в массиве swift или objc без необходимости использования необязательной привязки:

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

или же

let directoryContent: NSArray = fileManager.contentsOfDirectoryAtPath(documentsDirectory, error: &error)!
Другие вопросы по тегам