gpt4 book ai didi

ios - swift/ Spring 'Date components' 错误

转载 作者:行者123 更新时间:2023-11-28 06:34:37 25 4
gpt4 key购买 nike

这是接收问题代码的代码行:

let components: NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: [])

问题代码:

'components' produces 'Date Components', not the expected contextual result type 'NSDateComponents'

附加代码:

public func timeAgoSinceDate(date:NSDate, numericDates:Bool) -> String {
let calendar = NSCalendar.current
let unitFlags: NSCalendar.Unit = [NSCalendar.Unit.minute, NSCalendar.Unit.hour, NSCalendar.Unit.day, NSCalendar.Unit.weekOfYear, NSCalendar.Unit.month, NSCalendar.Unit.year, NSCalendar.Unit.second]
let now = NSDate()
let earliest = now.earlierDate(date as Date)
let latest = (earliest == now as Date) ? date : now
let components: NSDateComponents = calendar.components(unitFlags, fromDate: earliest, toDate: latest, options: [])

最佳答案

Swift 3 为现有的值类型引入了一堆新的基础类类型,例如 Date对于 NSDate , Calendar为了 NSCalendar .一些原因是

  • 提供适当的值语义,
  • letvar而不是可变和不可变的变体,
  • 更多“Swifty”API。

详情可见

您可以在值类型和相应的 NS 之间建立桥梁类型(就像您对 date as Date 所做的那样),并且当现有的 Foundation API 是导入到 Swift 中,类型会自动桥接。

因此NSCalendar.current返回 Calendar代替 NSCalendar , 和 calendar.components返回 DateComponents而不是 NSDateComponents .

有时 Xcode 迁移器可以为您解决这些问题。如果不,您必须查找新类型及其方法。

在您的情况下,Swift 3 端口将如下所示:

func timeAgoSinceDate(date: Date, numericDates: Bool) -> String {
let calendar = Calendar.current
let components: Set<Calendar.Component> = [.minute, .hour, .day, .weekOfYear, .month, .year, .second]
let now = Date()
let (earliest, latest) = (now <= date) ? (now, date) : (date, now)
let dateComponents = calendar.dateComponents(components, from: earliest, to: latest)

// ...
}

请注意 DateComparable , 因此您可以比较日期直接如now <= date .这对于 NSDate 是不可能的(除非您明确实现)。

关于ios - swift/ Spring 'Date components' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com