Swift 3中与NSURL.URLByAppendingPathComponent()等效的是什么?

28

我正在跟随一份使用Swift构建简单iOS应用的基础教程进行学习

这个教程是用Swift 2.x编写的,而我使用的是XCode 8Beta和Swift 3。

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

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类参考文档(或者,URL类所定义的库的Swift 3接口 - 我仍然不完全理解命名规则),以便将来自行研究?


2
只是 .appendingPathComponent( - Leo Dabus
1
你应该更新到 beta 4 - Leo Dabus
1
更新后,您的代码将再次更改。您需要使用urls(for:in:)方法来获取文档目录,而appendingPathComponent不会再抛出异常。更加简洁。 - Leo Dabus
2
顺便提一下,您可能希望使用FileManager.default 而不是 FileManager() - Rob
2
你还可以在Xcode编辑器中cmd点击URL,跳转到其定义。你应该很快找到你需要的方法。 - Martin R
显示剩余2条评论
3个回答

43

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

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

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

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

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

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


12

现在已更改为 appendingPathComponent(_:) 并且会抛出错误,因此您需要将其包装在 do-catch 块中。

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

更新

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

有关详细信息,请参见 @Hamish 的回答。


4
func appendingPathComponent(String)

=> 返回一个新的URL,该URL是由将路径组件附加到原始URL而创建的。

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

如果它是一个目录:

func appendingPathComponent(String, isDirectory: Bool)

=> 在原始URL后添加路径组件并返回新的URL,如果该组件被指定为目录,则附加尾随斜杠。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接