LoginSignup
4
4

More than 5 years have passed since last update.

Cocoapodsから導入したObjective-CのライブラリをSwiftから使用する

Posted at

内容

動機:SwiftからObjective-Cのライブラリimportするとエラーが出る!

実験:platformの指定が原因か?

結論:platformではなく、frameworksを使うかどうかの指定が必要だった。

実験手順

  1. テスト用プロジェクトの作成(名前をtest_CocoaPodsとし,swiftファイルを扱う)
  2. Podfileを記述。NLCoreDataをインストールしたい。platformはiOS:8.0とする。
  3. Podsをインストールする
  4. ViewControllerファイル内でNLCoreData/NSManagedObjectなどのメソッドを使ってみる
  5. NLCoreDataをimport宣言してみる
  6. BridgintHeaderファイルを作成、設定してみる

試したいこと

  1. platformの指定は必要なのか
  2. BridgintHeaderの宣言は必要なのか

その他知りたいこと

  • Objective−Cライブラリ内のフィールドをSwift側からアクセサを使って操作できるのかどうか。そのためにはObjective−C側で自動生成されたアクセサをSwift側で使用しなければならない。

手順1.テスト用プロジェクトの作成

新規プロジェクト
screenshot.png
SingleViewを選択
screenshot.png
名前をtest_CocoaPodsとする
screenshot.png

手順2.Podfileの記述

以下のように指定する

Podfile
 platform :ios, '8.0'
   use_frameworks!

   target 'test_CocoaPods' do
     pod 'NLCoreData', '~> 0.5'
   end

手順3.Podsのインストール

インストール完了
screenshot.png

手順4.メソッドを使って見る

使いたいメソッドたち

myTrainingLogApp
    @IBAction func writeBtn(sender: AnyObject) {
        // mainContextはNSM..のもつfield
        var myContext = NSManagedObjectContext.mainContext()
        let myEntity: NSEntityDescription! = NSEntityDescription.entityForName("Training.m", inManagedObjectContext: myContext)

        NSManagedObject.setEntityName(myEntity)
        (NLCoreData.shared()).setModelName("aiueo")

//        [[NLCoreData shared] setModelName:@"xxxx"];

        var newData = Training.m(entity: myEntity, insertIntoManagedObjectContext: myContext)
        newData.statement = weightText.text
        newData.time = NSDate()

        myContext.save(nil)
    }

viewDidLoag()内に入れてみる。

エラー発生
screenshot.png

NSManagedObjectが定義されていないようだ。
これをimport NLCoreDataで解決する。

手順5.NLCoreDataのimport

import後、Runさせた。
screenshot.png
挿入直後はエラーが表示されたが、ビルド?コンパイル?とにかくRunさせたらすんなり通った。アプリも真っ白だけど起動した。

わかったこと

  • platformを指定してimportしたらSwift内でObject−Cライブラリのフィールド、メソッドは使用できる。
  • Runしないと消えないエラーがある

手順6.BridgintHeaderの設定は

省きます。問題なくimportできているようなので。
代わりに、本当にplatformが問題だったのかどうかを調べる。

実験6':platformの指定は必要なのか

以下のようにplatformの指定部分をコメントアウトしてみる。
問題のプロジェクトではここがコメントアウトされたままであった。
screenshot.png

$ pod update

screenshot.png

結果、問題なく起動した。
もしかしたら
何気なく追加してしまった
use_frameworks!
ってとこが問題なのかも。(元のプロジェクトでは記述していなかった)
コメントアウトして見る。
screenshot.png

でた!エラーだ!そっかーこれかー。

ちょっと関係無いけどkobitoアプリはオフラインで画像をアップロードしようとすると落ちるみたいだ。
あと、画像貼りすぎたのか? 重くなってきた。むしろ重くなって落ちたのかな。

結論:platformはどうでもよくて、frameworksを使う?という命令が必要だった

(!がついてるから、使わない。の方かも?)

おわり。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4