Swift 3: Date vs NSDate?

早过忘川 提交于 2020-01-27 03:50:58

问题


What is the difference between the NS and non NS classes? Particularly NSDate vs Date? Does NS represent some type of wrapper around the core non NS functionality?


回答1:


Swift 3 introduced some new overlay value types for existing Foundation class types, such as Date for NSDate, Data for NSData and some more. The full list and details can be found in

  • SE-0069 Mutability and Foundation Value Types

Some of the reasons were

  • Provide proper value semantics,
  • let and var instead of mutable and immutable variants,
  • more "Swifty" APIs.

The new overlay types should provide all functionality that the corresponding Foundation type has, but if necessary, you can always cast from one type to the other.

When existing Foundation APIs are imported into Swift, the types are bridged automatically.

With respect to Date and NSDate: Date is a value type and can be a constant or variable:

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

whereas NSDate is a reference type and immutable. Also Date is Comparable

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

if date1 < date2 { }

whereas NSDates can only be compared with .compare().

Remark: For these "overlay types", the value type (struct) such as Date and its Foundation counterpart (class) such as NSDate are different types and both can be used from Swift. It must not be confused with

  • SE-0086 Drop NS Prefix in Swift Foundation

where the NS prefix has simply been dropped for certain Foundation classes, e.g. NSBundle is renamed to Bundle for Swift 3.




回答2:


NS classes are Objective-C classes. As Objective-C is the older programming language for iOS or MacOS applications, Swift allows you to use those classes structs in your code. So you can migrate applications from Objective-C to Swift if you want to.

The non-NS classes or structs are the Swift equivalents of the the NS classes or structs. You can read more about this issue here or here.

But be aware: As Objective-C and Swift do are different programming languages, it can happen that NS and non-NS classes are not completely working the same way.




回答3:


As well as the answers given above, in a more surface literal design sense, NS was a prefix given to everything in the NextStep days, before Steve Jobs was called back to Apple, and so was a natural part of Objective-C syntax.

Fast forward to the development of Swift, they needed a point of obvious difference, abd it could well have been CL as a prefix, (for Chris Lattner) but obviously chose to have an absence of any prefix




回答4:


The difference between NS and non NS classes is that the NS classes are reference type whereas the non NS classes are value type . In swift 3 , the Apple has introduced Foundation classes like NSDate and re-named them to Date but since swift is based on value types rather than reference type therefore Date is a value type. For instance:

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

2 . Permissible as although date is constant but mutability is dependent on class rather than let vs variable.

whereas

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

4. is not allowed not allowed and would result in Error as let makes 'date' a constant with 'let' as date is Date() type which is a value type.




回答5:


NSDate and Date are not the same thing. NS (next step) classes are at the current moment only used in Objective-C so in Objective-C to represent a date variable NSDate.

In regards to specifically Swift 3.0 the newest release of Swift Apple has entirely removed the need of using the NS prefix to any of the types. So just in Swift three we now use Date instead of NSDate. to make your code look cleaner



来源:https://stackoverflow.com/questions/39811352/swift-3-date-vs-nsdate

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!