[英]Swift - How to initialize a default value for NSDate property?
我有一个简单的类定义:
class Course{
var date:NSDate
init(){
}
}
例如,在c#中,创建此类时,date属性的默认值为DateTime.MinValue。
我不想让这个NSDate? 因为根据我的业务逻辑,此属性是必须的,并且每门课程都有一个日期 。 (设置为NSDate?意味着课程可以在没有日期的情况下存在)
我不想将它设置为Now,因为它具有误导性。 现在可能是一个有效值,该值来自我的业务逻辑的其他部分。
我怎样才能在swift中做同样的事情?
如果所有课程都需要有效日期,您为什么要创建没有真实日期的课程? 摆脱init()
并创建一个指定的初始化程序。
class Course{
let date: NSDate
init(date: NSDate) {
self.date = date
}
}
如果你坚持拥有这些奇怪的“不真实日期”,你可以使用distantPast()
。
class Course{
var date: NSDate
init() {
self.date = NSDate.distantPast() as NSDate
}
}
您可以像这样创建NSDate
的扩展:
extension NSDate
{
class func minimumDate() -> NSDate
{
let calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
return calendar.dateWithEra(1, year: 1, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)!
}
}
这将允许您使用类似的1/1/0001 00:00:00
时间戳实例化新的NSDate
:
let myDate = NSDate.minimumDate()
Swift还有一个null-coalesce运算符( ??
),允许你在初始化程序中执行类似的操作:
class Widget
{
var dateCreated : NSDate
init(dateCreated: NSDate?)
{
self.dateCreated = dateCreated ?? NSDate.minimumDate()
}
}
如果你总是在init
方法中初始化date
(如果,如你所说,它必须有一个日期),那么以下是好的:
class Course {
var date: Date // if Swift 2 we’d use `NSDate`, but in Swift 3 and later, we’d use `Date`
init() {
date = ... // set it to some reasonable, default value
}
}
或者,如果没有合理的默认值,您可以指定一个初始值设定项,您可以在其中提供值:
class Course {
var date: Date
init(date: Date) {
self.date = date
}
}
但是,如果有理由说明在实例化对象时无法指定值,并且只能在稍后的某个时间点设置日期,但是它应始终具有从该点开始的值,则可以使用隐式解包的可选项。 作为隐式解包的选项的文档说:
有时从程序的结构中可以清楚地看出,在首次设置该值之后,可选项将始终具有值。 在这些情况下,每次访问时都不需要检查和解包可选的值,因为可以安全地假设它始终具有值。
这些类型的选项被定义为隐式解包的选项。 您通过在要使其成为可选的类型之后放置感叹号(
String!
)而不是问号(String?
)来编写隐式展开的可选项。
因此,你会有
class Course {
var date: Date!
init() {
// the `date` is not necessarily set here, but once it is set, it shouldn't be `nil` thereafter
}
}
是的,从技术上讲,使用隐式展开的可选, date
可能是nil
,但实践是如果它最初可能是nil
,但是一旦设置,它将永远不会再为nil
,你将使用隐式包装的可选。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.