【发布时间】:2016-10-01 20:50:13
【问题描述】:
NS 类和非 NS 类有什么区别?特别是NSDate vs Date? NS 是否代表围绕核心非 NS 功能的某种类型的包装器?
【问题讨论】:
-
我认为是一样的,Apple 在 Swift 3 中将 NSDate 更改为 Date 但我不确定。
NS 类和非 NS 类有什么区别?特别是NSDate vs Date? NS 是否代表围绕核心非 NS 功能的某种类型的包装器?
【问题讨论】:
Swift 3 引入了一些新的覆盖值类型
基础类类型,如Date 代表NSDate,Data 代表
NSData 等等。完整列表和详细信息可在
其中一些原因是
let 和 var 而不是可变和不可变的变体,新的叠加层类型应提供所有功能 相应的 Foundation 类型具有,但如有必要,您可以 总是可以从一种类型转换为另一种类型。
当现有的 Foundation API 导入到 Swift 中,类型会自动桥接。
关于Date 和NSDate:Date 是一个值类型
并且可以是常量或变量:
var date = Date()
date += 10.0 // Add 10 seconds
而NSDate 是一个引用类型并且是不可变的。
还有Date 是Comparable
let date1 = Date()
let date2 = Date()
if date1 < date2 { }
而NSDates 只能与.compare() 比较。
备注:对于这些“覆盖类型”,值类型(struct)
例如 Date 及其 Foundation 对应物(类),例如 NSDate
是不同的类型,两者都可以从 Swift 中使用。
不要与
NS 前缀已被某些基金会简单地删除
类,例如对于 Swift 3,NSBundle重命名为 Bundle。
【讨论】:
除了上面给出的答案,在更表面的字面设计意义上,NS 是在 NextStep 时代赋予所有事物的前缀,在史蒂夫乔布斯被召回 Apple 之前,Objective-C 的自然部分也是如此语法。
快进 Swift 的发展,他们需要一个明显的区别点,abd 很可能是 CL 作为前缀,(对于 Chris Lattner)但显然选择没有任何前缀
【讨论】:
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 类型都是值类型(例如Operation 和OperationQueue)。但是,是的,一般来说,它们是,Date 肯定是。其次,值得注意的是,引用非NS“类”是没有意义的,因为它们中的绝大多数根本就不是类。其中大部分是struct 值类型。
date 是一个常数,而是因为dateByAddingTimeInterval 在Date 上不存在。等效为date + 1000,这是合法的。
Date 语法是 date.addingTimeInterval(1000) 或 date + 1000 ...
NSDate 和 Date 不是一回事。 NS(下一步)类目前仅在 Objective-C 中使用,因此在 Objective-C 中表示日期变量 NSDate。
就 Swift 3.0 而言,Apple 最新版本的 Swift 完全消除了对任何类型使用 NS 前缀的需要。所以就在 Swift 3 中,我们现在使用 Date 而不是 NSDate。让你的代码看起来更干净
【讨论】:
Date 和 NSDate 是not同一类型,它们不在github.com/apple/swift-evolution/blob/master/proposals/… 中涵盖。 – NSDate 和 Date 仍然存在,可以在 Swift 中使用。
NS 类型都有非NS 类似物(至少目前还没有)。