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!
}
}
