2016-01-21 81 views
0

在一个函数中,我检索一个目录列表。我想让函数在返回目录之前接受一个过滤参数来过滤检索。将过滤器转换为Swift函数作为参数?

这是我的函数:

public func getDocumentPaths(filter: ???? = nil) -> [String] { 
    do { 
     var directoryUrls = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(...) 

     // TODO: Filter the directory contents if applicable 
     if filter != nil { 
      directoryUrls = directoryUrls.filter(filter) 
     } 

     return directoryUrls.map { $0.absoluteString } 
    } catch let error as NSError { 
     return [String]() 
    } 
} 

最后,我想这样调用该函数:

getDocumentPaths() 
getDocumentPaths { $0.pathExtension == "mp3" } 

什么是滤波器参数类型允许这样做?

更新:基于@phimage's suggestion,我使上面的函数更像Swift 2.0。更是如此,FileKit看起来不错!

public func getDocumentPaths() -> [String] { 
    // Get the directory contents including folders 
    guard let directoryUrls = try? NSFileManager.defaultManager().contentsOfDirectoryAtURL(NSURL(string:"")!, includingPropertiesForKeys: nil, options: []) else { 
      // Failed so return empty list 
      return [String]() 
    } 

    return directoryUrls.map { $0.path! } 
} 
+1

请注意(可能)'absoluteString'不是*您想要将url转换为字符串,而是使用'path'方法。有关类似问题,请参阅http://stackoverflow.com/questions/34135305/nsfilemanager-defaultmanager-fileexistsatpath-returns-false-instead-of-true。 –

回答

3

如果你想如果你想绝对字符串过滤

func getDocumentPaths(filter: ((String) -> Bool)? = nil) -> [String] { 
    do { 
     var directoryUrls = try NSFileManager.defaultManager().contentsOfDirectoryAtURL... 


     var directoryStrings = directoryUrls.map { $0.path } 
     // Filter the directory contents if applicable 
     if let f = filter { 
      directoryStrings = directoryStrings.filter(f) 
     } 

     return directoryStrings 
    } catch { 
     return [String]() 
    } 
} 

PS上NSURL

func getDocumentPaths(filter: ((NSURL) -> Bool)? = nil) -> [String] { 
    do { 
     var directoryUrls = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(NSURL(string:"")!, includingPropertiesForKeys: nil, options: []) //contentsOfDirectoryAtURL(NSURL(string:"")!) 

     // Filter the directory contents if applicable 
     if let f = filter { 
      directoryUrls = directoryUrls.filter(f) 
     } 

     return directoryUrls.map { $0.path } 
    } catch { 
     return [String]() 
    } 
} 

过滤:日志或重新抛出异常

PS2:你可以像FileKit一样使用库来轻松管理文件,有find方法