Swift3 在Swift 3中展开可选值时意外发现nil
我有一个时间表应用程序,在将所有内容转换为Swift 3后,某一行抛出了EXC_BAD_指令错误,声明在展开可选值时意外发现了nil 这是代码,最后一行返回错误:Swift3 在Swift 3中展开可选值时意外发现nil,swift3,Swift3,我有一个时间表应用程序,在将所有内容转换为Swift 3后,某一行抛出了EXC_BAD_指令错误,声明在展开可选值时意外发现了nil 这是代码,最后一行返回错误: class CyclicDay { enum CyclicDayError: Error { case invalidStartDate } lazy var baseline: Date! = { var compone
class CyclicDay {
enum CyclicDayError: Error {
case invalidStartDate }
lazy var baseline: Date! = {
var components = DateComponents()
components.day = 27
components.month = 3
components.year = 2017
return Calendar.current.date(from: components)!
}()
func dayOfCycle(_ testDate: Date) throws -> Int {
if let start = baseline {
let interval = testDate.timeIntervalSince(start as Date)
let days = interval / (60 * 60 * 24)
return Int(days.truncatingRemainder(dividingBy: 14)) + 1 }
throw CyclicDayError.invalidStartDate }}
override func viewDidLoad() {
// Do any additional setup after loading the view, typically from a nib.
let cd = CyclicDay()
let day = try! cd.dayOfCycle(Date())
let date = Date()
let calendar = Calendar.current
let components = calendar.dateComponents([.hour, .minute], from: date)
let hour = components.hour
let minutes = components.minute
_ = "\(String(describing: hour)):\(String(describing: minutes))"
let lengthTestHour = "\(String(describing: hour))"
let lengthTestMinute = "\(String(describing: minutes))"
let formatter = DateFormatter()
formatter.dateFormat = "a"
formatter.amSymbol = "AM"
formatter.pmSymbol = "PM"
let dateString = formatter.string(from: Date())
var finalHour = String()
if lengthTestHour.characters.count == 1 {
finalHour = String("0\(String(describing: hour))")
} else {
finalHour = "\(String(describing: hour))"
}
if lengthTestMinute.characters.count == 1 {
_ = "0\(String(describing: minutes))"
} else {_ = minutes }
let convert = finalHour
let mTime = Int(convert)
// mTime * 100 + minutes
let compTime = mTime! * 100 + minutes!
在Swift 3中,所有日期组件都是可选的,您需要打开选项
let hour = components.hour!
let minutes = components.minute!
否则,字符串插值会带来麻烦
顺便说一句:你不需要字符串描述,只是写个例子
_ = "\(hour):\(minutes)"
不管怎样,我想知道为什么您要手动执行所有格式化工作,而不是使用您创建的日期格式化程序。问题在于以下两行:
let lengthTestHour = "\(String(describing: hour))"
let lengthTestMinute = "\(String(describing: minutes))"
您认为lengthTestHour将存储7这样的值,而lengthTestMinute将存储33这样的值。但不,lengthTestHours实际上持有期权7,lengthTestMinutes实际上持有期权33
然后指定lengthTestHour进行转换,并尝试将Optional7转换为Int,这显然是不可能的。现在mTime为零,您尝试在最后一行强制展开。轰
这是因为StringDescripting:返回一个可选的。可以通过以下操作缩短和固定这两条线:
let lengthTestHour = "\(hour!)"
let lengthTestMinute = "\(minute!)"