SwiftでiOS開発:RSSリーダー
Swiftを使ってサンプルiOSアプリを作ってみました。
作成したアプリケーションはRSSリーダーです。
RSSリーダーはTableViewを使いますし、データの通信もあるので、サンプルとしては手頃です。
今回はシンプルにYahoo!トピックスの見出しのみを表示して、内容はSafariに飛ばして表示するようにしています。
まずはXcode 6を立ちあげて、Single View Applicationから作成します。
言語はもちろんSwiftです。
Main.storyboardのViewの上にTableViewを配置します。
TableViewを右クリックしてdataSourceとdelegateをViewControllerにつなげておきます。
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,NSXMLParserDelegate {
Objective-CのMWFeedParser(RSSパーサー)を使用した例はあったのですが、Swiftだけで書くために今回はNSXMLParser(標準ライブラリのXMLパーサー)を使用します。
SwfitのRSSパーサーのライブラリはまだないのですね。
let feedUrl : NSURL = NSURL(string: "http://rss.dailynews.yahoo.co.jp/fc/rss.xml")
RSSのURLを指定します。今回はソースに直書きです。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var parser : NSXMLParser = NSXMLParser(contentsOfURL: feedUrl) parser.delegate = self; parser.parse() }
NSXMLParserDelegateプロトコルを継承しているので、NSXMLParserオブジェクトを作成してparse処理を自分自身にdelegateします。
var items : [Item] = [Item]()
class Item { var title : String! var url : String! }
RSSのitemをItemクラスに格納し、配列に保持しておきます。
辞書でも構造体でもよかったのですが、今回はインナークラスを使ってやりました。
あとはUITableViewDelegateプロトコルとNSXMLParserDelegateプロトコロのメソッドを適切に実装していくだけです。
GitHub
https://github.com/mizumotok/RSS-Reader-Swift
Code
import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,NSXMLParserDelegate { let feedUrl : NSURL = NSURL(string: "http://rss.dailynews.yahoo.co.jp/fc/rss.xml") required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } @IBOutlet weak var tableView: UITableView! var items : [Item] = [Item]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var parser : NSXMLParser = NSXMLParser(contentsOfURL: feedUrl) parser.delegate = self; parser.parse() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") let item = items[indexPath.row] cell.textLabel?.text = item.title return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let item = items[indexPath.row] UIApplication.sharedApplication().openURL(NSURL(string: item.url)) } var currentElementName : String! let itemElementName = "item" let titleElementName = "title" let linkElementName = "link" func parserDidStartDocument(parser: NSXMLParser!) { } func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) { currentElementName = nil if elementName == itemElementName { items.append(Item()) } else { currentElementName = elementName } } func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { currentElementName = nil; } func parser(parser: NSXMLParser!, foundCharacters string: String!) { if items.count > 0 { var lastItem = items[items.count-1] if currentElementName? == titleElementName { var tmpString : String? = lastItem.title lastItem.title = (tmpString != nil) ? tmpString! + string : string } else if currentElementName? == linkElementName { lastItem.url = string } } } func parserDidEndDocument(parser: NSXMLParser!) { self.tableView.reloadData() } class Item { var title : String! var url : String! } }