2016-09-08 18 views
1

這裏是代碼接收問題的代碼行:斯威夫特/春「日期組件的錯誤

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: []) 

回答

1

Swift 3爲現有的引入了一組新的值類型 10基礎班級類型,如DateNSDate,CalendarNSCalendar。有些原因是

  • 提供適當的值語義,
  • letvar代替可變和不可變的變體,
  • 更多「SWIFTY」的API。

的細節可以在

您可以在值類型和相應的NS型 之間的橋樑(如您date as Date所做的那樣)被找到,現有的基礎上,當API是 導入到Swift中,類型自動橋接。

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

有時,Xcode遷移器可以爲您解決這些問題。如果不是, 你必須查找新的類型和他們的方法。

在你的情況下,斯威夫特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 (除非你明確實施)。

+0

非常感謝。這工作完美。 –