Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”

Posted

技术标签:

【中文标题】Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”【英文标题】:Swift: Cannot convert value of type 'NSDate' to expected argument type 'NSDateComponents' 【发布时间】:2015-11-22 20:45:40 【问题描述】:

有人知道我该如何解决这个问题吗?我收到此错误:

¨无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”¨在线:

错误发生在以下行:

let competitionDay = userCalendar.dateFromComponents(competitionDate)!

这是更完整的代码摘录:

func Date()                

    // Here we set the current date

    let date = NSDate()
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components([.Hour, .Minute, .Second, .Nanosecond], fromDate: date)
    let hour = components.hour
    let minutes = components.minute
    let month = components.month
    let year = components.year
    let day = components.day


    let currentDate = calendar.dateFromComponents(components)



    // here we set the due date. When the timer is supposed to finish
    // final Calendar value

        let userCalendar = NSCalendar.currentCalendar()


        let competitionDate:NSDate = myDatePicker.date


        competitionDate.timeIntervalSinceNow


        let competitionDay = userCalendar.dateFromComponents(competitionDate)!


    // Here we compare the two dates
    competitionDay.timeIntervalSinceDate(currentDate!)


    let dayCalendarUnit = calendar.components([NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: date)


    //here we change the seconds to hours,minutes and days


    let competitionDayDifference = calendar.components([.Day, .Hour, .Minute],
            fromDate: currentDate!, toDate: competitionDay, options: NSCalendarOptions())

    //finally, here we set the variable to our remaining time
    let daysLeft = competitionDayDifference.day
    let hoursLeft = competitionDayDifference.hour
    let minutesLeft = competitionDayDifference.minute

【问题讨论】:

哪一行显示错误? 错误信息不是很清楚吗? dateFromComponents() 采用 NSDateComponents 参数。在dateFromComponents(competitionDate) 中,您正在传递一个 NSDate。 @MartinR 你知道我该如何解决吗?如果您可以在代码中显示它,将不胜感激 @Gjeruldsen:正如 Rob 所说,目前尚不清楚您要达到的目标。 【参考方案1】:

在您最初的问题中,您调用了dateFromComponents,它将NSDateComponents 转换为NSDate,但提供了competitionDate,它已经是NSDate。编译器只是简单地通知你这个错误。

--

顺便说一句,您使用来自NSDate.Hour.Minute.Second.Nanosecond 填充NSDateComponents,然后继续尝试保存对components.year 的引用和components.monthcomponents.day,即使您没有指定这些组件应包含在NSDateComponents 中。

--

下面你说:

这是一个倒计时应用程序,我让它一直运行,直到我想要一个 DatePicker 来选择我倒计时的日期。比赛日期是截止日期

如果这确实是您想要的,那么可能根本不需要NSDateComponents。我可能只是使用NSDateComponentsFormatter 方法stringFromDate:toDate: 向用户显示两个NSDate 对象之间的时间量的漂亮字符串表示。

例如:

class ViewController: UIViewController 

    @IBOutlet weak var datePicker: UIDatePicker!
    @IBOutlet weak var label: UILabel!

    weak var timer: NSTimer?

    let formatter: NSDateComponentsFormatter = 
        let _formatter = NSDateComponentsFormatter()
        _formatter.allowedUnits = [.Year, .Month, .Day, .Hour, .Minute, .Second]
        _formatter.unitsStyle = .Full

        return _formatter
    ()

    override func viewDidLoad() 
        super.viewDidLoad()

        datePicker.date = NSDate().dateByAddingTimeInterval(1000) // initialize it to whatever you want
    

    override func viewDidAppear(animated: Bool) 
        super.viewDidAppear(animated)

        timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "didFireTimer:", userInfo: nil, repeats: true)
    

    override func viewDidDisappear(animated: Bool) 
        super.viewDidDisappear(animated)

        timer?.invalidate()
    

    func didFireTimer(timer: NSTimer) 
        label.text = formatter.stringFromDate(NSDate(), toDate: datePicker.date)
    

【讨论】:

感谢您的回答。我可能自己应该明白如何解决这个问题,但如果你能告诉我如何用代码解决这个问题,我将不胜感激? 这是一个倒计时应用程序,我一直运行它,直到我想要一个 DatePicker 来选择我倒计时的日期。比赛日期是截止日期 对不起。我刚刚更新了这个问题。希望现在更容易理解。我想要的输出只是 currentDate 和 CompetitionDate 之间的日期差。 那我就用NSDateComponentsFormatter。见上文。 非常感谢您的帮助!

以上是关于Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”的主要内容,如果未能解决你的问题,请参考以下文章

Swift“无法将''类型的值转换为'String'类型

Swift:无法将“UnsafeMutablePointer”类型的值转换为预期的参数类型“UnsafeMutablePointer”

Swift 1.2 到 Swift 2:无法将类型的值转换为预期的参数类型

Swift 无法将 CBPeripheral 类型的值转换为预期的参数类型

Swift:无法将类型“[String:DayData]”的值转换为预期的参数类型“AnyObject?”

从 Swift 2.3 -> 3.2 转换时,无法将 String 类型的值转换为指定类型 NSManagedObjectContext