【问题标题】:pathExtension is unavailable: Use pathExtension on NSURL instead. Swift 2.0pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 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
        }
    }

【问题讨论】:

    标签: ios xcode swift swift2


    【解决方案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 ?? ""
             }
          }
          

          【讨论】:

            猜你喜欢
            • 2018-05-17
            • 1970-01-01
            • 2014-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-22
            • 2017-03-24
            • 2018-02-13
            相关资源
            最近更新 更多