Подтвердить что ты не робот

PathExtension недоступно: вместо этого используйте pathExtension для NSURL. Swift 2.0

Я получаю mp3 файлы из Document Directory, я написал, что pathExtension равен "mp3", в Swift 1.2 он работает, но в Swift 2.0 я получаю ошибку "pathExtension" недоступен: вместо этого используйте pathExtension в NSURL. "

 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
        }
    }
4b9b3361

Ответ 1

Просто измените порядок: сначала filter, чем map. Теперь метод pathExtension применяется к объектам NSURL.

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

Вы можете опустить пару круглых скобок после filter и map с помощью правила trailing closure.

Apple удалила связанный с дорогой API из String, чтобы предпочесть более подходящий URL.

Ответ 2

Или вы можете использовать это расширение:

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

Ответ 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
    }
}

Ответ 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)
    }
}

Ответ 5

Я объединил подход Дхармеша и Лео, чтобы заставить мое продление работать:

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

Ответ 6

Спецификации Swift Doc 1.2 относительно этих функций не возвращают необязательный параметр

Чтобы сделать его обратно совместимым с 1.2 в Swift 2.0, сделайте следующее:

Улучшить версию @Dharmesh Kheni.

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