Swift - 新更新提供可选问题

Posted

技术标签:

【中文标题】Swift - 新更新提供可选问题【英文标题】:Swift - New Update gives optional issues 【发布时间】:2016-09-16 03:56:19 【问题描述】:

我刚刚在我的 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)"

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

【问题讨论】:

有人知道如何在第 1-9 个月和第 1-9 天之前给我零吗? 如果您使用DateFormatterdateFormatyyyy-MM-ddHH:mm:ss,它将被格式化为前导零。 【参考方案1】:

DateComponents 的所有属性都已转换为例如可选项

var day: Int?  get set 

但您可以安全地打开 components 变量中指定的所有属性。

var day = components.day!

【讨论】:

你能安全地打开这些吗?让您想知道为什么它们成为可选的。 @PatrickGoley - 它们是可选的,因为它们可能没有任何值(取决于dateComponents 的第一个参数是什么)。任何时候一个值可能没有值,你真的应该让它成为可选的,这大概就是苹果相应地更新DateComponents 的原因。如果它们不是可选的,那将是一个糟糕的设计。 @PatrickGoley 您可以(始终)安全地打开函数components(from: date:)中指定的所有组件【参考方案2】:

如果您希望它使用前导零格式化,使用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!)

【讨论】:

【参考方案3】:

在创建 timeStringdateString 时,您需要使用 ! 解包变量:

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

print(timeString)
print(dateString)

将打印出来:

6:0:25
2016/9/16

【讨论】:

以上是关于Swift - 新更新提供可选问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 可选日期比较

在 Python 中为类提供可选函数的最佳实践

Swift新手教程12-可选链

Swift 3 更新中的错误 - 在展开可选值时意外发现 nil

IGListkit 是不是提供了实现类似于 Doppelganger/Doppelganger swift 库的更新接口的能力?

Swift 字符串与字符串!与字符串?