什么是 NSURL 的 Swift 3 等价物。URLByAppendingPathComponent()?

What is the Swift 3 equivalent of NSURL.URLByAppendingPathComponent()?

提问人:Pekka 提问时间:8/7/2016 最后编辑:ForgePekka 更新时间:1/17/2017 访问量:18137

问:

我正在学习一个关于在 Swift 中构建一个简单的 iOS 应用程序的基本教程

它是用 Swift 2.x 编写的,我使用 XCode 8 Beta 和 Swift 3。

本教程建议使用 来查找数据目录。类名已更改,因此自动修复的 Swift 3 如下所示:NSFileManager

static let DocumentsDirectory = FileManager().urlsForDirectory(.documentDirectory, inDomains:.userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.URLByAppendingPathComponent("meals")

但是,Xcode 现在抱怨

Value of type 'URL' has no member 'URLByAddingPathComponent'

我现在无法找出该方法的名称。

NSURL 类参考不包含任何关于如何在 Swift 3 中解决它的提示

  • 新方法名称是什么?

  • 我必须去哪里找到 Swift 3 的完整类参考(或者,定义类的库的 Swift 3 接口 - 我仍然不完全理解命名法),以便将来我可以自己研究这些?URL

swift xcode nsurl swift3

评论

2赞 Leo Dabus 8/7/2016
只是 .appendingPathComponent(
1赞 Leo Dabus 8/7/2016
您应该更新到 beta 4
1赞 Leo Dabus 8/7/2016
更新后,您的代码将再次更改。您需要对文档目录使用 urls(for:in:) 方法,并且 appendingPathComponent 将不再抛出。更干净
2赞 Rob 8/7/2016
顺便说一句,您可能想要而不是.FileManager.defaultFileManager()
2赞 Martin R 8/7/2016
您也可以在 Xcode 编辑器中按住 cmd 键单击,以跳转到其定义。您应该快速找到所需的方法。URL

答:

12赞 Khundragpan 8/7/2016 #1

它现在已经更改为 and it throws,因此您需要将其包装在 do - catch 块中appendingPathComponent(_:)

do {
  let archiveURL = try documentsDirectory?.appendingPathComponent("meals")
} catch {
  print(error)
}

更新

根据 Xcode 8 beta 4,appendingpathcomponent(_:) 不会抛出错误。

有关相关信息,请参阅@Hamish的回答

43赞 Hamish 8/7/2016 #2

从 Xcode 8 beta 4 开始,它被命名为 appendingPathComponent(_:),并且不会抛出。

static let archiveURL = documentsDirectory.appendingPathComponent("meals")

此外,正如 Leo Dabus 在评论中指出的那样,您的属性需要更改为在 beta 4 中使用 urls(for:in:):documentsDirectory

static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

(请注意,根据 Swift API 设计指南,我已将您的属性名称设为 lowerCamelCase。我还建议使用 FileManager.default,而不是创建新实例。

您可以查看 Apple 最新的 API 参考指南,了解 Swift 3 中发生的 API 命名更改。

4赞 Girish Chovatiya 8/7/2016 #3
func appendingPathComponent(String)

=> 返回通过将路径组件附加到原始 URL 而创建的新 URL。

static let archiveURL = documentsDirectory?.appendingPathComponent("meals")

如果是目录:

func appendingPathComponent(String, isDirectory: Bool)

=> 返回通过将路径组件附加到原始 URL 而创建的新 URL,如果该组件被指定为目录,则返回尾部斜杠。

static let archiveURL = documentsDirectory?.appendingPathComponent("meals", isDirectory: true)