- 更新日: 2015年7月3日
- Swift & iOS
Swiftで日付(NSDate型)を文字列(String型)に変換
Swift で NSDate(日付・時間の型)を String(文字列の型)に変換して出力する方法です。後述するサンプルコードで、最初 CoreData の Date 型(Swift/Objective-C の NSDate 型)の属性をそのまま読み出そうとしたところ、エラーになってしまった。
— 環境 —
Swift 1.2
Xcode 6.3.2
Cannot assign a value of type ‘NSDate’ to a value of type ‘String?’
以下のサンプルコードは CoreData を使っており、NSManagedObject として SomeModel モデル(エンティティ)があるとします。また、その属性(attribute)として Date 型(NSDate)の created_at を持っている。records[indexPath.row].created_at と呼び出して、UITableView のセルの textLabel のテキストとして設定しようとしたところ、Date を String に変換できないためエラーが発生しました。
修正前の SomeViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class SomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var tableView: UITableView! var records: [SomeModel]! override func viewDidLoad() { super.viewDidLoad() records = SomeModel.MR_findAllSortedBy("created_at", ascending: false) as? [SomeModel] tableView.reloadData() } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.section == 0 { let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell") as! UITableViewCell cell.textLabel!.text = records[indexPath.row].created_at // => ここでエラー return cell } return UITableViewCell() } // ... } |
上記コードだと正しく動作しません。records[indexPath.row].created_at as! String と強制キャストも駄目でした。
NSDateFormatter() で NSDate を String に変換
調べたところ、NSDate 型を String 型として出力するには、NSDateFormatter() によってフォーマットする必要があるそうです。NSDateFormatter() を使った dateString(date: NSDate) メソッドを定義して、それを使うように修正しました。
修正後の SomeViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class SomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var tableView: UITableView! var records: [SomeModel]! override func viewDidLoad() { super.viewDidLoad() records = SomeModel.MR_findAllSortedBy("created_at", ascending: false) as? [SomeModel] tableView.reloadData() } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.section == 0 { let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell") as! UITableViewCell cell.textLabel!.text = dateString( records[indexPath.row].created_at ) return cell } return UITableViewCell() } private func dateString(date: NSDate) -> String { let dateFormatter = NSDateFormatter() dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" let dateString: String = dateFormatter.stringFromDate(date) return dateString } // ... } |
上記の修正により、cell の textLabel に日付の文字列を表示させることができました。
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!