Swift 无法转换类型为';NSDate?&x27;到预期的参数类型';字符串';?

Swift 无法转换类型为';NSDate?&x27;到预期的参数类型';字符串';?,swift,date,nsdateformatter,Swift,Date,Nsdateformatter,以下是代码: 来自服务器的Dict值: { "leave_from" = "2016-10-26"; "leave_to" = "2016-10-30"; "user_id" = 327; } let date2 = dict["leave_from"] as! String let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "dd-MM-yyyy" let date = dateFo

以下是代码:

来自服务器的Dict值:

  {
  "leave_from" = "2016-10-26";
  "leave_to" = "2016-10-30";
  "user_id" = 327;
  } 

 let date2 = dict["leave_from"] as! String
 let dateFormatter = NSDateFormatter()
 dateFormatter.dateFormat = "dd-MM-yyyy"
 let date = dateFormatter.dateFromString(date2)
 self.FromDate.setTitle(date, forState: .Normal)
这里我得到的日期格式是
yyyy-MM-dd
,但我想更改为
dd-MM-yyy
,并显示在“开始日期”按钮中。

请帮我找出解决方案。

显然,dateFromString返回一个NSDate,而setTitle需要一个字符串

你需要在头脑中清楚地区分:NSDate是一个绝对的时间点。这与你的手表上的显示无关。如果我给你打电话,我们两人同时给NSDate()打电话,我们会得到相同的NSDate,即使我们的手表可能相隔数小时

字符串用于使用某种日历和某种格式显示日期。如果要更改日历或格式,请使用从字符串中读取NSDate的方法,然后使用另一种方法将NSDate转换为字符串。那部分不见了


注:不要坚持显示格式。使用当前日历以用户想要的任何格式显示NSDate

显然,dateFromString返回一个NSDate,而setTitle需要一个字符串

你需要在头脑中清楚地区分:NSDate是一个绝对的时间点。这与你的手表上的显示无关。如果我给你打电话,我们两人同时给NSDate()打电话,我们会得到相同的NSDate,即使我们的手表可能相隔数小时

字符串用于使用某种日历和某种格式显示日期。如果要更改日历或格式,请使用从字符串中读取NSDate的方法,然后使用另一种方法将NSDate转换为字符串。那部分不见了


注:不要坚持显示格式。使用当前日历以用户想要的任何格式显示NSDate

你做错了

首先,您试图用不正确的格式化程序读取日期。在第二秒钟,您将日期设置为按钮标题,它需要
String
,而不是
NSDate

你应该这样写:

// Created variable to represent string you fetch from Dictionary
var dateString = "2016-10-30"

// Creates date formatter instance
let dateFormatter = NSDateFormatter()

// Sets date format required to read date from variable `dateString `
dateFormatter.dateFormat = "yyyy-MM-dd"

// Reads date form variable `dateString `
let date = dateFormatter.dateFromString(dateString)

// Sets date format required to convert `Date` to `String`
dateFormatter.dateFormat = "dd-MM-yyyy"

// Converts `Date` to `String`
let buttonTitle = dateFormatter.stringFromDate(date!)

// Creates example button (just for presentation needs)
let button = UIButton()

// Sets `String` title for a button
button.setTitle(buttonTitle, forState: .Normal)
在您的情况下,它将类似于:

let dateString = dict["leave_from"] as! String

let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.dateFromString(dateString)

dateFormatter.dateFormat = "dd-MM-yyyy"
let buttonTitle = dateFormatter.string(from: date)

self.FromDate.setTitle(buttonTitle, forState: .Normal)

p.S.小心用力打开你做错了

首先,您试图用不正确的格式化程序读取日期。在第二秒钟,您将日期设置为按钮标题,它需要
String
,而不是
NSDate

你应该这样写:

// Created variable to represent string you fetch from Dictionary
var dateString = "2016-10-30"

// Creates date formatter instance
let dateFormatter = NSDateFormatter()

// Sets date format required to read date from variable `dateString `
dateFormatter.dateFormat = "yyyy-MM-dd"

// Reads date form variable `dateString `
let date = dateFormatter.dateFromString(dateString)

// Sets date format required to convert `Date` to `String`
dateFormatter.dateFormat = "dd-MM-yyyy"

// Converts `Date` to `String`
let buttonTitle = dateFormatter.stringFromDate(date!)

// Creates example button (just for presentation needs)
let button = UIButton()

// Sets `String` title for a button
button.setTitle(buttonTitle, forState: .Normal)
在您的情况下,它将类似于:

let dateString = dict["leave_from"] as! String

let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.dateFromString(dateString)

dateFormatter.dateFormat = "dd-MM-yyyy"
let buttonTitle = dateFormatter.string(from: date)

self.FromDate.setTitle(buttonTitle, forState: .Normal)

p.S.小心用力打开

您正在使用DateFormatter的
dateFromString
方法,该方法从字符串返回日期(如名称所示)。您要做的是基于日期返回字符串,这就是为什么您应该使用
stringFromDate

如果要更改日期的格式,首先必须使用JSON中的格式解析日期,然后只需更改DateFormatter的dateFormat

    let date2 = dict["leave_from"] as! String
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let date = dateFormatter.dateFromString(date2)

    dateFormatter.dateFormat = "dd-MM-yyyy"
    let dateString = dateFormatter.string(from: date)

    self.FromDate.setTitle(date, forState: .Normal)

您正在使用DateFormatter的
dateFromString
方法,该方法从字符串返回日期(如名称所示)。您要做的是基于日期返回字符串,这就是为什么您应该使用
stringFromDate

如果要更改日期的格式,首先必须使用JSON中的格式解析日期,然后只需更改DateFormatter的dateFormat

    let date2 = dict["leave_from"] as! String
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let date = dateFormatter.dateFromString(date2)

    dateFormatter.dateFormat = "dd-MM-yyyy"
    let dateString = dateFormatter.string(from: date)

    self.FromDate.setTitle(date, forState: .Normal)

您缺少对方法签名的一些阅读
date
是一个
NSDate
对象,并且
setTitle(:forState:)
正在等待第一个参数的字符串对象,而不是
NSDate
一个。找到解决方案了吗?。您缺少对方法签名的一些读取
date
是一个
NSDate
对象,并且
setTitle(:forState:)
正在等待第一个参数的字符串对象,而不是
NSDate
对象。得到解决方案了吗?。。