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 天之前给我零吗? 如果您使用DateFormatter
与dateFormat
或yyyy-MM-dd
或HH: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】:在创建 timeString
和 dateString
时,您需要使用 !
解包变量:
let timeString = "\(hour!):\(minutes!):\(seconds!)"
var dateString = "\(year!)/\(month!)/\(day!)"
print(timeString)
print(dateString)
将打印出来:
6:0:25
2016/9/16
【讨论】:
以上是关于Swift - 新更新提供可选问题的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 更新中的错误 - 在展开可选值时意外发现 nil
IGListkit 是不是提供了实现类似于 Doppelganger/Doppelganger swift 库的更新接口的能力?