【问题标题】:NSDate Extension not workingNSDate 扩展不起作用
【发布时间】:2017-05-23 10:45:03
【问题描述】:

这是一段在早期版本的 swift 中工作的代码。它现在给出一个错误(无法将类型“NSDate”的值转换为强制类型“NSDate.Date”)

extension NSDate {
struct Date {
    static let formatterISO8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601)! as Calendar
        formatter.locale = NSLocale.current
        formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone!
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
        return formatter
    }()
}


var formattedISO8601: String { return Date.formatterISO8601.string(from: self as Date) }

}

【问题讨论】:

  • 关于 Swift 3,你的代码是一团糟。请使用原生 Swift 3 结构 Date(这会导致错误,因为它与您的 Date 结构冲突!)、CalendarLocaleTimeZone
  • 这似乎应该是 DateFormatter 而不是 Date 的扩展(除了 Date 类型已经存在并且您在这里声明一个新类型......)。此外,根据您的部署目标,您可以使用最新版本中引入的NSISO8601DateFormatter 类。

标签: ios swift3 nsdate


【解决方案1】:

问题是在 Swift 3 中已经有一个名为 Date 的结构定义。

所以你可以做的是将你的结构名称更改为MyDate 或其他名称,然后你就可以开始了。

另外,最好使用新的DateCalendarTimeZone 而不是NSDateNSCalendarNSTimeZone

或者像这样扩展Date

extension Date {

    static let formatterISO8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale.current
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
        return formatter
    }()

    var formattedISO8601: String { return Date.formatterISO8601.string(from: self) }
}

【讨论】:

    【解决方案2】:

    NSDate 和 Date 的扩展。

    extension Date {
        static let formatterISO8601: DateFormatter = {
            let formatter = DateFormatter()
            formatter.calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601)! as Calendar
            formatter.locale = NSLocale.current
            formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone!
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
            return formatter
        }()
    
        func formattedISO8601() -> String {
            return Date.formatterISO8601.string(from: self)
        }
    }
    
    extension NSDate {
        func formattedISO8601() -> String {
            return Date.formatterISO8601.string(from: self as Date)
        }
    }
    

    并像这样使用它......

    // NSDate
    let nsdate = NSDate.init()
    let formattedDate = nsdate.formattedISO8601()
    
    // Date
    let date = Date.init()
    let formattedNsDate = date.formattedISO8601()
    

    【讨论】:

      【解决方案3】:

      试试这个

         extension Date {
      
          static let formatterISO8601: DateFormatter = {
            let formatter = DateFormatter()
            formatter.calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601)! as Calendar
            formatter.locale = NSLocale.current
            formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone!
            formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
            return formatter
          }()
      
      
      
        var formattedISO8601: String { return Date.formatterISO8601.string(from: self)
        }
      }
      

      【讨论】:

      • 好的,但已经有一个 Date 结构,你正在用它制作另一个结构
      • 现在它看起来还可以忽略在 swift 3 中使用 nstimezone 和 nscalendar
      • 同意@NiravD。
      猜你喜欢
      • 2014-11-30
      • 2014-02-20
      • 2019-03-21
      • 2011-08-18
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多