2015-09-18 12 views
11

Tôi nhận được tệp mp3 từ Thư mục Tài liệu, tôi đã viết rằng đường dẫnExtension bằng "mp3", trong Swift 1.2 nó đang hoạt động, nhưng trong Swift 2.0 tôi nhận được lỗi "'pathExtension' không khả dụng: Sử dụng pathExtension trên NSURL . "đường dẫnKhông có sẵn: Sử dụng đường dẫnExtension trên NSURL thay thế. 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 
     } 
    } 

Trả lời

3

Chỉ cần thay đổi thứ tự: thứ nhất filter, hơn map. Bây giờ phương thức pathExtension được áp dụng cho các đối tượng NSURL.

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

Bạn có thể bỏ qua các cặp ngoặc sau filtermap bằng cách sử dụng quy tắc trailing closure.

Apple đã xóa API liên quan đến đường dẫn từ String để thích phù hợp hơn URL.

9

Hoặc bạn có thể sử dụng phần mở rộng này:

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

tôi cần phải kết hợp Dharmesh và cách tiếp cận của Leo để có được gia hạn của tôi để làm việc: 'mở rộng chuỗi { công var url: NSURL { trở NSURL (fileURLWithPath: tự) } var công 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

trông rất đẹp, nhưng việc đúc NSString có thể ít tốn kém hơn ;-) – vadian

0

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

Để làm cho nó tương thích ngược với 1.2 trong Swift 2.0, làm điều này:

Cải thiện phiên bản của @Dharmesh Kheni.

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

tôi kết hợp Dharmesh và cách tiếp cận của Leo để có được gia hạn của tôi để làm việc:

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

Căn cứ vào link này, phần mở rộng này sẽ giúp bạn trong nhiều trường hợp.

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) 
    } 
} 
Các vấn đề liên quan