如何在 Swift 中将 NSDateComponents 转换为 DateComponents

Posted

技术标签:

【中文标题】如何在 Swift 中将 NSDateComponents 转换为 DateComponents【英文标题】:How to convert NSDateComponents to DateComponents in Swift 【发布时间】:2016-09-27 19:32:20 【问题描述】:

我想将 NSDateComponents 转换为 DateComponents。我如何在 Swift 中做到这一点而无需强制转换。

【问题讨论】:

不知道为什么这个问题被关闭或否决。很高兴知道原因,因为这是一个有效的问题,其答案在 Apples API Docs 中是未知的。没有可用于将 NSDateComponents 转换为 DateComponents 的公共方法,我不想强​​制转换它。 @EricAya @matt 的回答并不完全正确。我已经在一个项目中尝试过了,它迫使我使用 NSDateComponent 投射 as DateComponent 错误:无法将类型“DateComponents”的值转换为指定类型“NSDateComponents”让 x: NSDateComponents = DateComponents() ^~~~~~~~~~~~~~~~ as NSDateComponents @EricAya 好的,所以我的问题的答案是没有要转换的公共 API,但我们只需要替换代码中的用法。仍然不确定为什么这个问题被否决,因为它是一个有效的问题,下面有不同的答案 另外,我注意到这里大约有一半的讨论是关于DateComponent->NSDateComponent,但问题恰恰相反。 【参考方案1】:

没有什么可以转换的。只需使用 DateComponents,只要你以前使用过 NSDateComponents。

(实际上,您可以使用as 从一个转换到另一个,但您永远不需要。您的代码应该包含 no 对 Swift 3 中 NSDateComponents 的引用。您使用 DateComponents 而不是。)

【讨论】:

如果 API 使用NSDateComponents,你几乎别无选择。即使您使用 DateComponents 编写所有代码,也无法 100% 避免它。【参考方案2】:

作为问题有效原因的补充以及为什么的示例:

并非所有 API 都已转换为 DateComponents。一个例子是 Contact 框架,其中 CNContact/CNMutableContact 类的实例属性dates 声明为

open var dates: [CNLabeledValue<NSDateComponents>]

不幸的是,没有内置的方法可以在两者之间进行转换,所以如果你想避免强制转换,你必须自己设置每个属性:

nsDateComponents.day = dateComponents.day
nsDateComponents.month = dateComponents.month
// etc ...

请注意,这不是两个类的属性的 1:1 映射,如果要进行完整映射,则必须查找 API。

【讨论】:

以上是关于如何在 Swift 中将 NSDateComponents 转换为 DateComponents的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 JSON 写入 Realm

如何在 Swift 中将文本居中?

如何在 Swift 中将 TextField 添加到 UIAlertView

如何在swift中将逗号添加到数字?

如何在 Swift 中将 UITextField 文本居中

如何在 Swift 中将 UIButton 居中?