【问题标题】:Swift 3: Date vs NSDate?Swift 3:日期与 NSDate?
【发布时间】:2016-10-01 20:50:13
【问题描述】:

NS 类和非 NS 类有什么区别?特别是NSDate vs DateNS 是否代表围绕核心非 NS 功能的某种类型的包装器?

【问题讨论】:

  • 我认为是一样的,Apple 在 Swift 3 中将 NSDate 更改为 Date 但我不确定。

标签: swift nsdate


【解决方案1】:

Swift 3 引入了一些新的覆盖值类型 基础类类型,如Date 代表NSDateData 代表 NSData 等等。完整列表和详细信息可在

中找到

其中一些原因是

  • 提供适当的值语义,
  • letvar 而不是可变和不可变的变体,
  • 更多“Swifty”API。

新的叠加层类型应提供所有功能 相应的 Foundation 类型具有,但如有必要,您可以 总是可以从一种类型转换为另一种类型。

当现有的 Foundation API 导入到 Swift 中,类型会自动桥接。

关于DateNSDateDate 是一个值类型 并且可以是常量或变量:

var date = Date()
date += 10.0 // Add 10 seconds

NSDate 是一个引用类型并且是不可变的。 还有DateComparable

let date1 = Date()
let date2 = Date()

if date1 < date2 { }

NSDates 只能与.compare() 比较。

备注:对于这些“覆盖类型”,值类型(struct) 例如 Date 及其 Foundation 对应物(类),例如 NSDate 是不同的类型,两者都可以从 Swift 中使用。 不要与

混淆

NS 前缀已被某些基金会简单地删除 类,例如对于 Swift 3,NSBundle重命名Bundle

【讨论】:

  • 谢谢马丁。在进行“标准”Swift 开发时,是否有关于使用哪个类的指南?
  • @MarcusLeon:由于 Swift 在导入现有 Foundation API 时已经桥接到新的覆盖类型,因此应该更喜欢使用新类型。我链接到的提案中列出了这些优点(例如正确的值语义)。 – 如果某些方法不可用,那么您可以转换回 Foundation 类型并调用旧方法。示例:stackoverflow.com/questions/39519144/nslocale-swift-3.
【解决方案2】:

NS 类是 Objective-C 类。由于 Objective-C 是用于 iOS 或 MacOS 应用程序的较旧的编程语言,Swift 允许您在代码中使用这些类结构。因此,您可以根据需要将应用程序从 Objective-C 迁移到 Swift。

非 NS 类或结构是 NS 类或结构的 Swift 等价物。您可以在herehere 阅读有关此问题的更多信息。

但请注意:由于 Objective-C 和 Swift 是不同的编程语言,NS 和非 NS 类的工作方式可能不完全相同。

【讨论】:

    【解决方案3】:

    除了上面给出的答案,在更表面的字面设计意义上,NS 是在 NextStep 时代赋予所有事物的前缀,在史蒂夫乔布斯被召回 Apple 之前,Objective-C 的自然部分也是如此语法。

    快进 Swift 的发展,他们需要一个明显的区别点,abd 很可能是 CL 作为前缀,(对于 Chris Lattner)但显然选择没有任何前缀

    【讨论】:

      【解决方案4】:

      NS 类和非 NS 类的区别在于 NS 类是引用类型,而非 NS 类是值类型。在 swift 3 中,Apple 引入了像 NSDate 这样的 Foundation 类并将它们重命名为 Date,但由于 swift 基于值类型而不是引用类型,因此 Date 是一种值类型。 例如:

      let date = NSDate() //1
      date.dateByAddingTimeInterval(1000) //2 
      

      2 。允许,因为尽管日期是常量,但可变性取决于类而不是 let vs 变量。

      let date = Date() //3
      date.dateByAddingTimeInterval(1000) //4
      

      4。 is not allowed not allowed 并且会导致错误,因为 let 使 'date' 成为常量,而 'let' 因为 date 是 Date() 类型,它是一个值类型。

      【讨论】:

      • 小澄清:首先,并非所有这些非NS 类型都是值类型(例如OperationOperationQueue)。但是,是的,一般来说,它们是,Date 肯定是。其次,值得注意的是,引用非NS“类”是没有意义的,因为它们中的绝大多数根本就不是类。其中大部分是struct 值类型。
      • 第二个失败不是因为date 是一个常数,而是因为dateByAddingTimeIntervalDate 上不存在。等效为date + 1000,这是合法的。
      • 是的,第 4 行的 Date 语法是 date.addingTimeInterval(1000)date + 1000 ...
      【解决方案5】:

      NSDateDate 不是一回事。 NS(下一步)类目前仅在 Objective-C 中使用,因此在 Objective-C 中表示日期变量 NSDate。

      就 Swift 3.0 而言,Apple 最新版本的 Swift 完全消除了对任何类型使用 NS 前缀的需要。所以就在 Swift 3 中,我们现在使用 Date 而不是 NSDate。让你的代码看起来更干净

      【讨论】:

      • 不,那是另一回事。 DateNSDatenot同一类型,它们不在github.com/apple/swift-evolution/blob/master/proposals/… 中涵盖。 – NSDate 和 Date 仍然存在,可以在 Swift 中使用。
      • 并非所有NS 类型都有非NS 类似物(至少目前还没有)。
      • NS 在 Swift 3 中的某些地方仍然需要,例如 Core Data。我有一个存储日期的属性。当我尝试为其分配 Date() 时,我收到一条错误消息,提示“无法将 'Date' 类型的值分配给 'NSDate'。但是,如果我在分配中将其转换为 NSDate,它可以正常工作。让 theDate = Date (); coreDataEntity.date = theDate as NSDate
      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多