pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0
Posted
技术标签:
【中文标题】pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0【英文标题】:pathExtension is unavailable: Use pathExtension on NSURL instead. Swift 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
【问题讨论】:
【参考方案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
规则省略filter
和map
之后的一对括号。
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 ?? ""
【讨论】:
以上是关于pathExtension 不可用:在 NSURL 上使用 pathExtension。斯威夫特 2.0的主要内容,如果未能解决你的问题,请参考以下文章
stringByAppendingPathComponent不可用
我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?
swift 'FIRInvalidArgumentException',原因:'不支持的类型:NSURL(在字段 AccountTypeImageURL 中找到)'