繁体   English   中英

Swift - 如何初始化NSDate属性的默认值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM