2014-08-29 100 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 
     } 
    } 
} 

编译错误如下:型“AnyObject”不符合协议“序列类型”

类型“AnyObject”不符合协议“序列类型”

哪些呢这个菜单?

谁可以帮助我,thks很多!!!!

回答

42

The Swift Programming Language苹果状态:

的for-in循环执行用于在一个范围内, 序列,集合,或进展的每个项目的一组语句。

现在,directoryContent只符合协议AnyObject,所以你不能使用for循环。如果你想这样做,你必须做类似下面的东西:

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

THKS了很多,从beta3版升级到beta6,出现了许多新的编译error.it似乎许多GitHub的项目需要重建的Xcode的-beta6 ,对我有什么好的建议? – 2014-08-29 07:56:18

+0

不错,在Swift 2里为我工作 – Naishta 2016-04-27 22:40:32

4

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)! 
相关问题