2017-04-14 41 views
-1

我有一個時間表的應用程序,一切都轉化爲斯威夫特3後,一個特定的行拋出EXC_BAD_INSTRUCTION錯誤,指出「意外發現零而展開的可選值」意外地發現爲零,而在斯威夫特展開一個可選值3

下面是代碼,最後一行將返回錯誤:

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! 

回答

2

在斯威夫特3日的所有部件都是可選的,你需要解開的自選

let hour = components.hour! 
let minutes = components.minute! 

否則你會遇到麻煩的字符串插值。

順便說一句:你不需要String(describing只寫例如

_ = "\(hour):\(minutes)" 

我想知道,反正你爲什麼所有格式的東西手動而不是使用您所創建的日期格式的。

1

問題就出在這兩條線:

let lengthTestHour = "\(String(describing: hour))" 
let lengthTestMinute = "\(String(describing: minutes))" 

你以爲lengthTestHour將存儲像"7"lengthTestMinute值將會有一個像"33"值。但沒有,lengthTestHours實際上持有"Optional(7)"lengthTestMinutes實際上持有"Optional(33)"

然後,您將lengthTestHour指定爲convert並嘗試將該Optional(7)事件轉換爲Int,這顯然無法完成。現在mTimenil並且您嘗試在最後一行強制展開。繁榮!

這是因爲String(describing:)返回一個可選項。這兩條線可以通過縮短和固定:

let lengthTestHour = "\(hour!)" 
let lengthTestMinute = "\(minute!)" 
相關問題