内容
動機:SwiftからObjective-Cのライブラリimportするとエラーが出る!
実験:platformの指定が原因か?
結論:platformではなく、frameworksを使うかどうかの指定が必要だった。
実験手順
- テスト用プロジェクトの作成(名前をtest_CocoaPodsとし,swiftファイルを扱う)
- Podfileを記述。NLCoreDataをインストールしたい。platformはiOS:8.0とする。
- Podsをインストールする
- ViewControllerファイル内でNLCoreData/NSManagedObjectなどのメソッドを使ってみる
- NLCoreDataをimport宣言してみる
- BridgintHeaderファイルを作成、設定してみる
試したいこと
- platformの指定は必要なのか
- BridgintHeaderの宣言は必要なのか
その他知りたいこと
- Objective−Cライブラリ内のフィールドをSwift側からアクセサを使って操作できるのかどうか。そのためにはObjective−C側で自動生成されたアクセサをSwift側で使用しなければならない。
手順1.テスト用プロジェクトの作成
新規プロジェクト
SingleViewを選択
名前をtest_CocoaPodsとする
手順2.Podfileの記述
以下のように指定する
platform :ios, '8.0'
use_frameworks!
target 'test_CocoaPods' do
pod 'NLCoreData', '~> 0.5'
end
手順3.Podsのインストール
手順4.メソッドを使って見る
使いたいメソッドたち
@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()内に入れてみる。
NSManagedObjectが定義されていないようだ。
これをimport NLCoreDataで解決する。
手順5.NLCoreDataのimport
import後、Runさせた。
挿入直後はエラーが表示されたが、ビルド?コンパイル?とにかくRunさせたらすんなり通った。アプリも真っ白だけど起動した。
わかったこと
- platformを指定してimportしたらSwift内でObject−Cライブラリのフィールド、メソッドは使用できる。
- Runしないと消えないエラーがある
手順6.BridgintHeaderの設定は
省きます。問題なくimportできているようなので。
代わりに、本当にplatformが問題だったのかどうかを調べる。
実験6':platformの指定は必要なのか
以下のようにplatformの指定部分をコメントアウトしてみる。
問題のプロジェクトではここがコメントアウトされたままであった。
$ pod update
結果、問題なく起動した。
もしかしたら
何気なく追加してしまった
use_frameworks!
ってとこが問題なのかも。(元のプロジェクトでは記述していなかった)
コメントアウトして見る。
でた!エラーだ!そっかーこれかー。
ちょっと関係無いけどkobitoアプリはオフラインで画像をアップロードしようとすると落ちるみたいだ。
あと、画像貼りすぎたのか? 重くなってきた。むしろ重くなって落ちたのかな。
結論:platformはどうでもよくて、frameworksを使う?という命令が必要だった
(!がついてるから、使わない。の方かも?)
おわり。