SwiftでiOS開発:RSSリーダー

LINEで送る
Pocket

Swiftを使ってサンプルiOSアプリを作ってみました。
作成したアプリケーションはRSSリーダーです。
RSSリーダーはTableViewを使いますし、データの通信もあるので、サンプルとしては手頃です。
今回はシンプルにYahoo!トピックスの見出しのみを表示して、内容はSafariに飛ばして表示するようにしています。

swift rss reader

まずは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!
    }
}
LINEで送る
Pocket

Tags:, ,

コメントを残す