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”,请让我知道!谢谢!
答
将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'而不是重新发明轮子? – rmaddy