Swift+CocoaPods with Xcode6

目的

Swiftを使って楽にiOSアプリを開発したい
便利なライブラリ群で開発工数を少なくしたい

作るもの

本来はiBeaconを利用してR2D2の位置検知をブログにと考えていましたが
iBeaconがいつまでたっても届かないので取り急ぎ慣れるためにサンプルが掲載されていた
MWFeedParserを利用したRSSReaderを少し改変(改悪)してみました。

当初はブログ化する予定はなかったのですが、以外にハマり所が多かったので、記事化しました。

参考ソース

ほぼほぼ最初のリンク先のRSSReaderを参考に作成しました。
ありがとうございました。

CocoaPods導入
http://www.atmarkit.co.jp/ait/articles/1403/08/news008.html

SwiftRSSReader
http://qiita.com/susieyy/items/749c4ac5d82d765c12c6
https://github.com/wantedly/swift-rss-sample/tree/master/RSSReader

http://espoirka.hateblo.jp/entry/2014/08/19/235510

nil値を含む変数で条件判定時にUnwrapしろ攻撃を受け ???状態に陥ったため参考になりました
http://qiita.com/cotrpepe/items/e30c7442733b93adf46a

MWFeedParserを利用したRSSReader

CocoaPods環境を整える

自己責任にてお願い致します

sudo gem update --system  

sudo gem install xcodeproj  

pod setup

#確認
pod --version  

プロジェクト作成

podファイルの準備

viなりで作成の方が楽ですが、 Xcodeで意地を通してみました。
ゴミファイルをいちいち削除しております。 Emptyファイルの追加
ファイル名は podfile 一緒に作成されたゴミファイル TemplateIcon2x.png の削除 Xcodeを完全に終了します

MWFeedParserインストール

Before

podコマンド実施前は上記のようなファイル構成です

インストール

下記のようにプロジェクトファイルが増えているので今後はそちらを利用する
From now on use XXX.xcworkspace と言われていますが、気づきづらいです。

After

ブリッジヘッダファイル作成

Objective-CクラスファイルをSwiftから利用するために必要

Podsの下にMWFeedParserディレクトリが出来上がっている!
ブリッジヘッダファイルの作成ですが、私が試した限りEmptyファイルのリネームでは上手く行かず CocoaTouch Classファイルを適当な名前(Test)で生成→削除で上手く行くことを確認しております。
(生成後にブリッジヘッダファイルを自動作成するか聞いて来ます) 自動生成を選択 いらないファイルを削除 Test.h / Test.m MWFeedParserを利用するためのimport行を記載
ここまで上手く行くと、ようやくViewClassにMWFeedParserを読み込める

コード実装

今回は単純に動作確認を実施したかったので
取得してきたRSSFeedをLabelに突っ込みました

TableViewを利用しきちんとしたアプリケーションに仕上げるには
参考リンク先の一番上を参照するのが良いとおもいます。

下記ViewController以外に編集したファイルは上記記載以外ありません。

//
//  ViewController.swift
//  SwiftRSSParser
//
//  Created by Takashi on 2014/10/05.
//  Copyright (c) 2014年 Takashi. All rights reserved.
//

import UIKit

class ViewController: UIViewController, MWFeedParserDelegate {

    var rssFeedTitle = ""
    var rssFeedItems = [MWFeedItem]()
    var titleLabel = UILabel(frame: CGRectMake(10,50,300,20))
    var bodyLabel = UILabel(frame: CGRectMake(10,60,300,200))

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let feedURL = NSURL.URLWithString("http://kouzu.info/rss");
        let feedParser = MWFeedParser(feedURL: feedURL)
        feedParser.delegate = self
        feedParser.parse()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // parse 開始
    func feedParserDidStart(parser: MWFeedParser) {
        self.view.addSubview(titleLabel)
        bodyLabel.numberOfLines = 20
        self.view.addSubview(bodyLabel)
    }

    // Feed Info の parse 完了
    func feedParser(parser: MWFeedParser, didParseFeedInfo info: MWFeedInfo) {
        rssFeedTitle = info.title
    }

    // Feed Item の parse 完了(1件毎)
    func feedParser(parser: MWFeedParser, didParseFeedItem item: MWFeedItem) {
        println(item)
        rssFeedItems.append(item)
    }

    // parse 完了時
    func feedParserDidFinish(parser: MWFeedParser) {
        var tmpLabel = ""
        titleLabel.text = "\(rssFeedItems.count) Feed in \(rssFeedTitle)) \n"

        for rssFeedItem in rssFeedItems {
            tmpLabel = tmpLabel + "\n" + rssFeedItem.title
        }
        bodyLabel.text = tmpLabel
    }
}

動作確認

無事RSSFeedを取得できました、お疲れ様でした。(実機でも動作確認をとれました)

takashi