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