NSURL.URLByAppendingPathComponent() 的 Swift 3 等价物是啥?

Posted

技术标签:

【中文标题】NSURL.URLByAppendingPathComponent() 的 Swift 3 等价物是啥?【英文标题】:What is the Swift 3 equivalent of NSURL.URLByAppendingPathComponent()?NSURL.URLByAppendingPathComponent() 的 Swift 3 等价物是什么? 【发布时间】:2016-12-13 05:27:12 【问题描述】:

我正在关注 a basic tutorial 在 Swift 中构建一个简单的 ios 应用程序。

它是用 Swift 2.x 编写的,我使用 XCode 8 Beta 和 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 Class Reference 不包含任何关于如何从 Swift 3 解决它的提示

新方法名称是什么?

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

【问题讨论】:

只是 .appendingPathComponent( 你应该更新到 beta 4 更新后您的代码将再次更改。您将需要对文档目录使用 urls(for:in:) 方法,并且 appendingPathComponent 将不再抛出。干净多了 顺便说一下,你可能想FileManager.default而不是FileManager() 您也可以在 Xcode 编辑器中 cmd-click URL 以跳转到其定义。你应该很快找到你需要的方法。 【参考方案1】:

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

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

与Leo Dabus points out in the comments 一样,您的documentsDirectory 属性需要更改为在beta 4 中使用urls(for:in:)

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

(请注意,我已将您的属性名称设为 lowerCamelCase,与 Swift API design guidelines 一致。我还建议使用 FileManager.default,而不是创建新实例。)

您可以查看Apple's latest API reference guide,了解 Swift 3 中发生的 API 命名更改。

【讨论】:

【参考方案2】:

它现在已更改为 appendingPathComponent(_:) 并且它会抛出,所以你需要将它包装在 do - catch 块中

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

更新

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

相关信息见@Hamish的回答

【讨论】:

【参考方案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)

【讨论】:

以上是关于NSURL.URLByAppendingPathComponent() 的 Swift 3 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章