Swift 3 - 当值为一个字符串时接收可选值

问题描述:

所以我有这个代码需要发布时间的日期并将其转换为“5h”或“1d”之前的日期。但是,它在我的应用程序中显示为这样 - 可选(1)h。Swift 3 - 当值为一个字符串时接收可选值

下面是代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "admincell", for: indexPath) as! AdminHomeCell 

    let post = activities[indexPath.row] 
    print(post["path"]) 
    //let image = images[indexPath.row] 
    //let imaged = post["path"] as! String 
    //let image = URL(string: imaged) 
    let username = post["username"] as? String 
    let title = post["title"] as? String 
    let date = post["date"] as! String 
    let description = post["text"] as? String 
    let location = post["location"] as? String 

    let dateFormater = DateFormatter() 
    dateFormater.dateFormat = "yyyy-MM-dd-HH:mm:ss" 
    let newDate = dateFormater.date(from: date)! 

    let from = newDate 
    let now = Date() 
    let components : NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfMonth] 
    let difference = (Calendar.current as NSCalendar).components(components, from: from, to: now, options: []) 

    if difference.second! <= 0 { 
     cell.postDate.text! = "now" 
    } 
    if difference.second! > 0 && difference.minute! == 0 { 
     cell.postDate.text! = "\(difference.second)s." // 12s. 
    } 
    if difference.minute! > 0 && difference.hour! == 0 { 
     cell.postDate.text! = "\(difference.minute)m." 
    } 
    if difference.hour! > 0 && difference.day! == 0 { 
     cell.postDate.text! = "\(difference.hour)h." 
    } 
    if difference.day! > 0 && difference.weekOfMonth! == 0 { 
     cell.postDate.text! = "\(difference.day)d." 
    } 
    if difference.weekOfMonth! > 0 { 
     cell.postDate.text! = "\(difference.weekOfMonth)w." 
    } 



    /* 
    let session = URLSession(configuration: .default) 
    let downloadPicTask = session.dataTask(with: image!) { 
     (data, response, error) in 
     if let e = error { 
      print("Error downloading image: \(e)") 
     } else { 
      if let res = response as? HTTPURLResponse { 
       if let image = data { 
        let pic = UIImage(data: image) 
        cell.postImage.image = pic 
       } else{ 
        print("couldn't get image: image is nil") 
       } 
      } else { 
       print("Couldn't get response code") 
      } 

     } 
    } 
    */ 
    cell.postTitle.text = title 
    cell.postUser.text = username 
    cell.postDescription.text = description 
    cell.postLocation.text = location 
    cell.postDate.text = date 

    cell.postDescription.lineBreakMode = .byWordWrapping // or NSLineBreakMode.ByWordWrapping 
    cell.postDescription.numberOfLines = 0 



    //downloadPicTask.resume() 
    return cell 
} 

如果有什么我应该改变,使其只显示“1H”,请让我知道!谢谢!

+3

为什么不使用'DateComponentsFormatter'而不是重新发明*? – rmaddy

将Xcode更新至8.3或更新版本,会出现一条警告消息,表示您正在打印一个可选值而不是正常值。

在您的代码中,您使用DateComponents,并且所有字段都是可选的,例如, difference.hour。您之前使用!来提取值进行比较,但它不是一个好方法,因为如果该值不存在,它会崩溃应用程序。

你应该做的是这样的:

guard let hour = difference.hour, 
     let minute = difference.minute, [...] else { return cell } 
// below code using hour as not optional 
在每一个可选值安全地解开它的方法

在斯威夫特3所有日期组件是自选,但你可以放心地解开它们在dateComponents(from:to:

指定的所有自选我建议使用局部变量:

let difference = Calendar.current.dateComponents([.second, .minute, .hour, .day, .weekOfMonth], from: from, to: now) 
let diffSec = difference.second! 
let diffMin = difference.minute! 
let diffHour = difference.hour! 
let diffDay = difference.day! 
let diffWeekOfMonth = difference.weekOfMonth! 

if diffSec <= 0 { 
    cell.postDate.text! = "now" 
} 
if diffSec > 0 && diffMin == 0 { 
    cell.postDate.text! = "\(diffSec)s." // 12s. 
} 
if diffMin > 0 && diffHour == 0 { 
    cell.postDate.text! = "\(diffMin)m." 
} 
if diffHour > 0 && diffDay == 0 { 
    cell.postDate.text! = "\(diffHour)h." 
} 
if diffDay > 0 && diffWeekOfMonth == 0 { 
    cell.postDate.text! = "\(diffDay)d." 
} 
if diffWeekOfMonth > 0 { 
    cell.postDate.text! = "\(diffWeekOfMonth)w." 
} 

不过看看DateComponentsFormatter