Swift - 新更新提供可选问题

Swift - New Update gives optional issues

我刚刚在我的 iOS 项目中更新到 Xcode 8 和 Swift 3。它现在给我的应用程序带来了问题。我的标签没有给我正确的日期和时间元素,而是显示 "Optional(2016)/Optional(09)/Optional(15)" 而不是 "2016/09/15"。自更新以来我没有更改任何代码,之前它是正确的。这是我正在使用的:

let date = Date()
let calendar = Calendar.current
let components = (calendar as NSCalendar).components([.month, .year, .day, .hour, .minute, .second], from: date)
var day = components.day
var day1 = components.day
var year = components.year
var month = components.month
let hour = components.hour
let minutes = components.minute
let seconds = components.second


let timeString = "\(hour):\(minutes):\(seconds)"
var dateString = "\(year)/\(month)/\(day)"

有人知道新的可选语法吗?

当您创建 timeStringdateString:

时,您需要用 ! 解包变量
let timeString = "\(hour!):\(minutes!):\(seconds!)"
var dateString = "\(year!)/\(month!)/\(day!)"

print(timeString)
print(dateString)

将打印出:

6:0:25
2016/9/16

DateComponents 的所有属性都已变成可选的,例如

var day: Int? { get set }

但是您可以安全地解包 components 变量中指定的所有属性。

var day = components.day!

如果你想用前导零格式化它,使用 DateFormatter:

可能是最简单的
let date = Date()

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

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "HH:mm:ss"
let timeString = timeFormatter.string(from: date)

如果您真的想自己构建这些字符串,请使用 String(format:):

let calendar = Calendar.current
let components = calendar.dateComponents([.month, .year, .day, .hour, .minute, .second], from: date)
let day = components.day
let year = components.year
let month = components.month
let hour = components.hour
let minutes = components.minute
let seconds = components.second

let timeString = String(format: "%02d:%02d:%02d", hour!, minutes!, seconds!)
let dateString = String(format: "%04d/%02d/%02d", year!, month!, day!)