繁体   English   中英

快速检查零并迅速从字典中提取数据

[英]check for nil and extract data from dictionary in swift

如果用户提供日期值,我会将其存储在字典中:

let dict:Dictionary<String, Any> = ["fromDate":fromDate as Any]

如果用户不提供日期值,则将其存储在这样的字典中:

let dict:Dictionary<String, Any> = ["fromDate": [:] ]

我试图像这样从cellForRowAt函数中的字典中检索值:

let dict:Dictionary<String, Any> = allDates[indexPath.row]
guard let fromDate:String = getDateString(createdDate: dict["fromDate"] as! Date) != nil else {
        fromDate:String = "None"
}
cell.fromDateLabel.text = getTimeStringISO8601(createdDate: fromDate)

这是我日期字符串功能

func getDateString(createdDate:Date) -> String{
    let formatter = DateFormatter()
    formatter.calendar = Calendar(identifier: .iso8601)
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.locale = Locale.current
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter.string(from: createdDate)
}

我在警卫声明中遇到错误:

类型“字符串”不是可选值,永远不能为零

如何检查date是否为nil并获取转换后的日期,如果date为nil则跳过它并在语句中输入“ None”而不是Date?

Guard语句中的错误是因为方法getDateString:不返回可选值。 您正在检查该方法的返回值,根据定义,该值永远不会为零。 您需要从dict检查日期值,因为它是可选的。

尝试像

var fromDate = "None" 
if let dateVal = dict["fromDate"] as? Date {
    fromDate = getDateString(createdDate: dateVal)
    cell.fromDateLabel.text = getTimeStringISO8601(createdDate: fromDate)
} else {
    cell.fromDateLabel.text = fromDate
}

尝试这个:

let dict:Dictionary<String, Any> = allDates[indexPath.row]

if let date = dict["fromDate"] as? Date {
    // the date is not nil
    //here you can formate your date
}else{
   //the date is nil, make additional stuff here 
}

只需添加可选以返回方法的值

**func getDateString(createdDate:Date) -> String?**


class UIViewController: UIViewController {

       guard let fromDate:String = getDateString(createdDate: Date())  else {

          return

        }
    }


    func getDateString(createdDate:Date) -> String?{
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.locale = Locale.current
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter.string(from: createdDate)
    }

如果您想正确使用展开功能,请按以下步骤操作:

let dict:Dictionary<String, Any> = allDates[indexPath.row]
guard let fromDate: String = getDateString(createdDate: dict["fromDate"] as? Date) else   {
    fromDate:String = "None"
}
 cell.fromDateLabel.text = getTimeStringISO8601(createdDate: fromDate)

并且您的函数应如下所示:

    func getDateString(createdDate:Date?) -> String?{
      if let createdDate = createdDate {
         let formatter = DateFormatter()
         formatter.calendar = Calendar(identifier: .iso8601)
         formatter.locale = Locale(identifier: "en_US_POSIX")
         formatter.locale = Locale.current
         formatter.timeZone = TimeZone(secondsFromGMT: 0)
         formatter.dateFormat = "yyyy-MM-dd"
         return formatter.string(from: createdDate)
      }

      return nil
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM