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

スポンサーリンク

swift2から3にバージョン変更したときに、カレンダーの日付を扱った実装周りで掲題の件が発生しました。

今まで、2016と表示できていたのが、Optional(2016)と表示されました。 対策としては、以下のようにすれば大丈夫でした。

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

理解すると単純な話でした。。。

参考
http://cloudcafe.tech/?p=1931(リンク切れ)

※もしかしたら参照リンクが変わったかもしれません。

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
}

コメント

タイトルとURLをコピーしました