質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1926閲覧

[swift3] JSONのpublishedDateをソートしたい

userA

総合スコア8

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/12/02 18:04

現在RSSのアプリを作成しています

var NewDataArray = NSMutableArray() var timeArray = [String]() var URL1 = "googleAPIを使用したURL" var URL2 = "googleAPIを使用したURL" var URL3 = "googleAPIを使用したURL" var URL4 = "googleAPIを使用したURL" var isLoading : Bool = false override func viewDidLoad() { super.viewDidLoad() RSSArray() } func RSSArray() { getRSS() getRSS0() getRSS1() getRSS2() } func getRSS() { if let requestURL = Foundation.URL(string: URL1) { Alamofire.request(requestURL, method: .get , parameters: nil).responseJSON { response in if response.result.isSuccess { let jsonDic = response.result.value as! NSDictionary let responseData = jsonDic["responseData"] as! NSDictionary let feed = responseData["feed"] as! NSDictionary if let entries = feed["entries"] as? NSArray { self.NewDataArray.addObjects(from: entries as! [Any]) DispatchQueue.main.async { self.myTableView.reloadData() } } } } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return NewDataArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 再利用するCellを取得する. let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell let Newdic = NewDataArray[indexPath.row] as! NSDictionary let title = Newdic["title"] as? String let publishedDate = Newdic["publishedDate"] as? String let links = Newdic["link"] as! String let contents = Newdic["content"] as! String let timedate = self.convertDateFormat(publishedDate!) cell.title.text = title cell.time.text = timedate cell.webimage.image = UIImage(named: "") return cell } //日付を変換 func convertDateFormat(_ dateStr:String) -> String { // 引数で渡ってきた文字列をNSDateFormatterでNSDateに直します let inFormatter = DateFormatter() inFormatter.locale = Locale(identifier: "en_US_POSIX") inFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z" let date:Date = inFormatter.date(from: dateStr)! // NSDateから指定のフォーマットの文字列に変換します let outFormatter = DateFormatter() outFormatter.dateFormat = "yyyy/MM/dd HH:mm" return outFormatter.string(from: date) } }

というコード内容なんですが、表示してみるとRSSArrayの順番に表示されます。
そこで、RSSArrayの順番ではなく日付のデータ["publishedDate"]の順番にtableviewに表示をしたいのですが、どのようにソートすれば良いのかわからないため、どうかご教授宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

publishedDateに、曜日の文字列(Satとか)が入っちゃってるとダメですね。ソート前に書式を変換すればうまくいきます。ソートの部分をsortDataというメソッドにまとめましたが、動けばOKなノリで書いてるので使うなら適当にリファクタリングしてください。あと、セルのクラス名とidentifierが同じだ私の環境だと正常な挙動にならなかったので変えてます。

swift

1// swift 3.0 / xocde 8.0 2 3// ViewController.swift 4 5import UIKit 6import Alamofire 7 8class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 9 10 @IBOutlet weak var myTableView :UITableView! 11 12 var NewDataArray = NSMutableArray() 13 var URL1 = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=50&q=https://goo.gl/6E1EPK" 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 myTableView.delegate = self 19 myTableView.dataSource = self 20 myTableView.register(ItemCell.self, forCellReuseIdentifier: "MyCell") 21 22 RSSArray() 23 } 24 25 override func didReceiveMemoryWarning() { 26 super.didReceiveMemoryWarning() 27 // Dispose of any resources that can be recreated. 28 } 29 30 31 func RSSArray() { 32 getRSS() 33 } 34 35 func getRSS() { 36 if let requestURL = Foundation.URL(string: URL1) { 37 Alamofire.request(requestURL, method: .get , parameters: nil).responseJSON { 38 response in 39 if response.result.isSuccess { 40 let jsonDic = response.result.value as! NSDictionary 41 let responseData = jsonDic["responseData"] as! NSDictionary 42 let feed = responseData["feed"] as! NSDictionary 43 if let entries = feed["entries"] as? NSArray { 44 45 // ソート 46 self.NewDataArray = self.sortData(entries,isAscending:false) 47 48 DispatchQueue.main.async { 49 self.myTableView.reloadData() 50 } 51 } 52 } 53 } 54 } 55 } 56 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 57 return NewDataArray.count 58 } 59 60 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 61 62 // 再利用するCellを取得する. 63 let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! ItemCell 64 65 let Newdic = NewDataArray[indexPath.row] as! NSDictionary 66 let title = Newdic["title"] as? String 67 let publishedDate = Newdic["publishedDate"] as? String 68 let links = Newdic["link"] as! String 69 let content = Newdic["content"] as! String 70 let timedate = publishedDate //self.convertDateFormat(publishedDate!) 71 72 cell.title.text = title 73 cell.time.text = timedate 74// cell.webimage.image = UIImage(named: "") 75 76 return cell 77 } 78 //日付を変換 79 func convertDateFormat(_ dateStr:String) -> String { 80 // 引数で渡ってきた文字列をNSDateFormatterでNSDateに直します 81 let inFormatter = DateFormatter() 82 inFormatter.locale = Locale(identifier: "en_US_POSIX") 83 inFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z" 84 let date:Date = inFormatter.date(from: dateStr)! 85 // NSDateから指定のフォーマットの文字列に変換します 86 let outFormatter = DateFormatter() 87 outFormatter.dateFormat = "yyyy/MM/dd HH:mm" 88 return outFormatter.string(from: date) 89 } 90 91 // RSSデータソート 92 private func sortData(_ entries:NSArray,isAscending:Bool) -> NSMutableArray { 93 94 let wk:NSMutableArray = [] 95 96 for i in 0 ..< entries.count { 97 98 let dic = entries[i] as! NSDictionary 99 100 // publishedDateの書式を変換しつつwkへ 101 let title = dic["title"] as! String 102 let link = dic["link"] as! String 103 let content = dic["content"] as! String 104 let publishedDate = self.convertDateFormat(dic["publishedDate"] as! String) 105 // etc... 106 107 wk[i] = ["title":title,"link":link,"content":content,"publishedDate":publishedDate] 108 } 109 110 // publishedDateでソート 111 let sd = NSSortDescriptor(key:"publishedDate",ascending:isAscending) 112 let sorted = wk.sortedArray(using: [sd]) as NSArray 113 114 return sorted.mutableCopy() as! NSMutableArray 115 116 } 117 118} 119 120// ItemCell.swift 121 122class ItemCell: UITableViewCell { 123 124 @IBOutlet weak var title:UILabel! 125 @IBOutlet weak var time:UILabel! 126 127 override func awakeFromNib() { 128 super.awakeFromNib() 129 // Initialization code 130 } 131 132 override func setSelected(_ selected: Bool, animated: Bool) { 133 super.setSelected(selected, animated: animated) 134 135 // Configure the view for the selected state 136 } 137 138} 139

実行結果
実行結果

投稿2016/12/04 20:19

編集2016/12/05 04:03
fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

userA

2016/12/05 05:29

実行に成功いたしました! ありがとうございます! 本当に助かりました! また機会があれば宜しくお願い致します!!!!
fuzzball

2016/12/05 06:04

日付は dd かと。(dでも動いてますが)
guest

0

NewDataArray作るところをこうしてみてください。

swift

1if let entries = feed["entries"] as? NSArray { 2 //self.NewDataArray.addObjects(from: entries as! [Any]) 3 var wk:NSMutableArray = [] 4 wk.addObjects(from: entries as! [Any]) 5 6 // publishedDateでソート 7 let sd = NSSortDescriptor(key:"publishedDate",ascending:false) // 降順 8 let sorted = wk.sortedArray(using: [sd]) as NSArray 9 self.NewDataArray.add(sorted) 10 11 DispatchQueue.main.async { 12 self.myTableView.reloadData() 13 } 14} 15

改変

swift

1if let entries = feed["entries"] as? NSArray { 2 3 var wk:NSMutableArray = entries.mutableCopy() as! NSMutableArray 4 5 // publishedDateでソート 6 let sd = NSSortDescriptor(key:"publishedDate",ascending:false) // 降順 7 let sorted = wk.sortedArray(using: [sd]) as NSArray 8 9 // self.NewDataArray.add(sorted) さらに改変 10 self.NewDataArray = sorted.mutableCopy() as! NSMutableArray 11 12 DispatchQueue.main.async { 13 self.myTableView.reloadData() 14 } 15}

ミニマムテストコード

swift

1// sfift 3.0 2 // test data 3 let entries:NSArray = [ 4 ["id":1,"title":"title 1","publishedDate":"2016-12-02 10:00:00"], 5 ["id":2,"title":"title 2","publishedDate":"2016-12-01 12:00:00"], 6 ["id":3,"title":"title 3","publishedDate":"2016-12-02 11:00:00"] 7 ] 8 9 var wk = NSMutableArray() 10 var NewDataArray = NSMutableArray() 11 12 wk = entries.mutableCopy() as! NSMutableArray 13 14 // publishedでソート 15 let sd = NSSortDescriptor(key:"publishedDate",ascending:false) // 降順 16 let sorted = wk.sortedArray(using: [sd]) as NSArray 17 NewDataArray = sorted.mutableCopy() as! NSMutableArray 18 19 print(NewDataArray) 20 21 /* 22 ( 23 { 24 id = 3; 25 publishedDate = "2016-12-02 11:00:00"; 26 title = "title 3"; 27 }, 28 { 29 id = 1; 30 publishedDate = "2016-12-02 10:00:00"; 31 title = "title 1"; 32 }, 33 { 34 id = 2; 35 publishedDate = "2016-12-01 12:00:00"; 36 title = "title 2"; 37 } 38 ) 39 */ 40

投稿2016/12/02 20:14

編集2016/12/04 12:04
fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

userA

2016/12/03 20:08

コメント誠にありがとうございます。 実際にやってみたのですが、self.NewDataArray.add(sorted)と表記するとCellに表示させるところでエラーがでました。 なので、self.NewDataArray.addObjects(from: sorted as! [Any] )でやった場合ビルドは通ったのですが、ソートされていませんでした。
fromageblanc

2016/12/04 00:22

修正したコードを追記で乗せましたのでそれでお試し願えないでしょうか。もしまたエラーが出るようなら、エラーも掲載していただけるとうれしいです。
userA

2016/12/04 07:21

修正ありがとうございます。 試したところ、self.NewDataArray.add(sorted)と入力してビルドしたところこのエラーが出ました Could not cast value of type 'Swift._SwiftDeferredNSArray' (0x107f021d8) to 'NSDictionary' (0x1059bd108). 確認宜しくお願い致します。
fromageblanc

2016/12/04 11:58

改変コードをさらに改変してaddからmutableCopyにしたので試してもいただけないでしょうか。また、ミニマムテスト用のコードも載せておきますのでデータ構造など確認お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問