2015-09-18 5 views
11

Dostaję pliki mp3 z katalogu dokumentów, napisałem, że pathExtension jest równy "mp3", w Swift 1.2 działa, ale w Swift 2.0 pojawia się błąd "rozszerzenie pathExtension jest niedostępne: użyj rozszerzenia path na serwerze NSURL . "pathExtension jest niedostępny: zamiast tego użyj parametru pathExtension na NSURL. Swift 2.0

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

Odpowiedz

3

Wystarczy zmienić kolejność: najpierw filter, niż map. Teraz metoda pathExtension jest stosowana do obiektów NSURL.

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

Można pominąć parę nawiasach po filter i map stosując regułę trailing closure.

Firma Apple usunęła związany z trasą interfejs API od String, aby wybrać bardziej odpowiedni URL.

9

Albo można użyć tego rozszerzenia:

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

Musiałem połączyć Dharmesh i podejść Leo, aby moje rozszerzenie do pracy: 'rozszerzenie String { public var url: bibliotece NSURL { powrót bibliotece NSURL (fileURLWithPath: self) } public var stringByDeletingLastPathComponent: String { return String (url.URLByDeletingLastPathComponent) } } ' –

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 
    } 
} 
+2

wygląda bardzo ładnie, ale rzutowanie NSString może być tańsze ;-) – vadian

1

I połączeniu Dharmesh i podejścia Leo, aby moje rozszerzenie do pracy:

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

bazujemy na tym link, rozszerzenie to pomoże w wielu przypadkach.

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) 
    } 
} 
Powiązane problemy