我有一个简单的类定义:
class Course{
var date:NSDate
init(){
}
}
例如,在c#中,创建此类时,date属性的默认值为DateTime.MinValue。
我不想让这个成为NSDate?因为我的业务逻辑 此属性是必须的,每个课程都有一个日期。 (设置为NSDate?意味着课程可以在没有日期的情况下存在)
我不想将它设置为Now,因为它具有误导性。现在可能 一个有效的值,来自我的业务逻辑的其他部分。
我怎样才能在swift中做同样的事情?
答案 0 :(得分:7)
如果所有课程都需要有效日期,您为什么要创建没有实际日期的课程?摆脱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
}
}
答案 1 :(得分:0)
您可以像这样创建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)!
}
}
这将允许您使用类似的NSDate
时间戳实例化新的1/1/0001 00:00:00
:
let myDate = NSDate.minimumDate()
Swift还有一个null-coalesce运算符(??
),允许你在初始化程序中执行类似的操作:
class Widget
{
var dateCreated : NSDate
init(dateCreated: NSDate?)
{
self.dateCreated = dateCreated ?? NSDate.minimumDate()
}
}
答案 2 :(得分:0)
如果您始终在date
方法中初始化init
(如果您说,它必须有日期),那么以下情况就可以了:
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
}
}
但是,如果有理由说明在实例化对象时无法指定值并且只能在稍后的某个时间点设置日期,但是它应始终具有从该点开始的值,那么您将使用隐式解包的可选项。对于隐式解包的选项,the documentation表示:
有时从程序结构可以清楚地看出,在首次设置该值之后,总是的可选项将具有值。在这些情况下,每次访问时都不需要检查和解包可选的值,因为可以安全地假设它始终具有值。
这些类型的选项被定义为隐式展开的选项。通过放置感叹号(
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
,但一旦设置,它将永远不会{再次{1}},您将使用隐式包装的可选项。