pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0

Posted

技术标签:

【中文标题】pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0【英文标题】:pathExtension is unavailable: Use pathExtension on NSURL instead. Swift 2.0 【发布时间】:2015-09-18 07:24:00 【问题描述】:

我从文档目录获取 mp3 文件,我写了 pathExtension 等于“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
        
    

【问题讨论】:

【参考方案1】:

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

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) 【参考方案2】:

基于这个link,这个扩展在很多情况下都会帮助你。

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)
    

【讨论】:

【参考方案3】:

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
    

【讨论】:

确实看起来很不错,但 NSString 转换可能更便宜 ;-)【参考方案4】:

只需更改顺序:首先是filter,然后是map。现在 pathExtension 方法被应用到 NSURL 对象上。

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

您可以使用trailing closure 规则省略filtermap 之后的一对括号。

Apple 已从 String 中删除了与路径相关的 API,以更喜欢更合适的 URL

【讨论】:

【参考方案5】:

我结合了 Dharmesh 和 Leo 的方法来让我的扩展工作:

  extension String  
      public var url: NSURL 
         return NSURL(fileURLWithPath:self)
      
      public var stringByDeletingLastPathComponent: String 
         return String(url.URLByDeletingLastPathComponent)
      
 

【讨论】:

【参考方案6】:

Swift Doc 1.2 specs regarding these funcs don't return an optional

要使其向后兼容 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 ?? ""
   

【讨论】:

以上是关于pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0的主要内容,如果未能解决你的问题,请参考以下文章

stringByAppendingPathComponent不可用

显示错误信息是互联网不可用

Xcode 6 错误“URLWithString”不可用?

我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?

swift 'FIRInvalidArgumentException',原因:'不支持的类型:NSURL(在字段 AccountTypeImageURL 中找到)'

iOS-判断URL是否可用,判断网址是否正确