pathExtension不可用:请改用NSURL的pathExtension。Swift 2.0

15

我从文档目录获取MP3文件,我写了路径扩展等于"mp3",在Swift 1.2中可以工作,但在Swift 2.0中出现错误“'pathExtension'不可用:请改用NSURL上的pathExtension。”

 func fetchFilesFromFolder() {
        let fileManager = NSFileManager.defaultManager()
        let folderPathURL = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)[0]
        if let directoryURLs = try? fileManager.contentsOfDirectoryAtURL(folderPathURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles) {
            listOfMP3Files = directoryURLs.map(){ $0.lastPathComponent! }.filter(){ $0.pathExtension == "mp3" } // error is here
        }
    }
6个回答

14

或者您可以使用这个扩展:

extension String {
    var ns: NSString {
        return self as NSString
    }
    var pathExtension: String {
        return ns.pathExtension
    }
    var lastPathComponent: String {
        return ns.lastPathComponent
    }
}

我需要结合Dharmesh和Leo的方法来使我的扩展程序正常工作:extension String { public var url: NSURL { return NSURL(fileURLWithPath:self) } public var stringByDeletingLastPathComponent: String { return String(url.URLByDeletingLastPathComponent) } } - Matt Bearson

4

根据这个链接,这个扩展将在许多情况下帮助您。

extension String {

    var lastPathComponent: String {
        get {
            return (self as NSString).lastPathComponent
        }
    }

    var pathExtension: String {
        get {

            return (self as NSString).pathExtension
        }
    }

    var stringByDeletingLastPathComponent: String {
        get {

            return (self as NSString).stringByDeletingLastPathComponent
        }
    }

    var stringByDeletingPathExtension: String {
        get {

            return (self as NSString).stringByDeletingPathExtension
        }
    }

    var pathComponents: [String] {
        get {

            return (self as NSString).pathComponents
        }
    }

    func stringByAppendingPathComponent(path: String) -> String {

        let nsSt = self as NSString

        return nsSt.stringByAppendingPathComponent(path)
    }

    func stringByAppendingPathExtension(ext: String) -> String? {

        let nsSt = self as NSString

        return nsSt.stringByAppendingPathExtension(ext)
    }
}

4

Xcode 8.3.2 • Swift 3.1

extension String {
    var fileURL: URL {
        return URL(fileURLWithPath: self)
    }
    var pathExtension: String {
        return fileURL.pathExtension
    }
    var lastPathComponent: String {
        return fileURL.lastPathComponent
    }
}

2
看起来确实很不错,但NSString转换可能会更便宜;-) - vadian

3

只需要改变顺序:先使用 filter,然后是 map。现在将方法 pathExtension 应用于 NSURL 对象。

listOfMP3Files = directoryURLs.filter { $0.pathExtension == "mp3" }.map { $0.lastPathComponent! }

使用 尾随闭包 规则,您可以省略在 filtermap 后面的一对括号。

为了更加合适,苹果已经从 String 中移除了与路径相关的 API,改用更适合的 URL


1
我结合了Dharmesh和Leo的方法来使我的扩展程序正常工作:
  extension String { 
      public var url: NSURL {
         return NSURL(fileURLWithPath:self)
      }
      public var stringByDeletingLastPathComponent: String {
         return String(url.URLByDeletingLastPathComponent)
      }
 }

0

Swift Doc 1.2规范中关于这些函数不返回可选项

为了使其向后兼容到Swift 2.0的1.2版本,请执行以下操作:

在@Dharmesh Kheni的版本基础上进行改进。

extension String {
  var ns: NSString {
    return self as NSString
  }
  var pathExtension: String {
    return ns.pathExtension ?? ""
 }
  var lastPathComponent: String {
    return ns.lastPathComponent ?? ""
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接