[swift3]Calendar日付出力でOptional(値)と表示されたときの対応

swift2から3にバージョン変更したときに、カレンダーの日付を扱った実装周りで掲題の件が発生しました。
今まで、”2016″と表示できていたのが、”Optional(2016)”と表示されました。

対策としては、以下のようにすれば大丈夫でした。
理解すると単純な話でした。

Optional型を元の型で扱いたい時は、変数の後ろに!をつける。

参考

DateComponentの各プロパティは、オプショナル型なので想定通りの動きと言えます。

swift2の時にdateComponents()ではなく、components()を使っており、そのときは期待通り表示できていました。
swift3にコンバートしていきなり現象が発生したように見えたため、最初は、Optionalの仕様が変わったのかなと思ってしまいました。。。

実装例:
(実際には、引数subjectがもっと長文で、もっと複雑な変換する必要があるケースで使ってました。
日付の表示フォーマットを変更するだけでしたら別の適切な方法をお使いください。)

    // 変換前:YYYY年MM月DD日
    func exchangeSubject(subject: String) -> String {
        // 日付の変換 YYYY MM DD
        let cal = Calendar.current
        let unitFlags = Set([.year, .month, .day])
        let comp = cal.dateComponents(unitFlags, from: datePicker1.date as Date)
        
        var str:String = subject
        // ★comp.year!などが今回"!"を追記した箇所です。
        str = str.replacingOccurrences(of: "YYYY", with: String(describing: comp.year!))
        str = str.replacingOccurrences(of: "MM", with: String(describing: comp.month!))
        str = str.replacingOccurrences(of: "DD", with: String(describing: comp.day!))
        
        // 変換後:2016年2月24日
        return str
    }

シェアする

  • このエントリーをはてなブックマークに追加

フォローする