2017-04-20 67 views
-2

所以我有這個代碼需要發佈時間的日期並將其轉換爲「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

回答

0

將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 
在每一個可選值安全地解開它的方法

0

在斯威夫特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

相關問題