Swift プロジェクトの Typhoon Framework バージョン 2.3.0 に非常に厄介な問題があります。
チュートリアルで述べたように、Podfile に Typhoon を含め、Pod をインストールし、ブリッジング ヘッダーを作成#import <Typhoon/Typhoon.h>
して、このヘッダーに追加しました。
次に、 ApplicationAssebly というアセンブリ サブクラスを作成しました。
import Foundation
public class ApplicationAssembly: TyphoonAssembly {
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
definition.injectProperty("myAssembly", with: self)
}
}
}
ご覧のとおり、そのアセンブリを AppDelegate に挿入します。Info.plist ファイルに TyphoonInitialAssemblies エントリも追加しました。そしてこの瞬間、私の問題が始まりました。NSException が発生するいくつかの組み合わせをテストしました。
名前 xxx のアセンブリを解決できません
この組み合わせは次のとおりです ( typtestはプロジェクト/バンドル名です):
- Info.plist の ClassName: ApplicationAssembly、Build Settings の Module プロパティを定義します:いいえ
- Info.plist の ClassName: ApplicationAssembly、Build Settings の Module プロパティを定義:はい
- Info.plist の ClassName: typhtest.ApplicationAssembly、Build Settings の Module プロパティを定義:いいえ
- Info.plist の ClassName: typhtest.ApplicationAssembly、Build Settings の Module プロパティを定義:はい
StackOverflow でこの回答を見つけたので、最後の組み合わせを試しました。
- Info.plist の ClassName: _TtC8typhtest19ApplicationAssembly、Build Settings の Module プロパティを定義:はい
この組み合わせは NSException をスローしませんが、以下の iPhone 5s (iOS 7.1) からのスタック トレースであるdyld_fatal_errorがあります。
iPhone シミュレーター (iOS 7.1) とはわずかに異なるスタック トレースを取得します。
iOS 8.1 シミュレーターで動作するのは奇妙なことです。また、Swift 用の Typhoon Sample Application は、私のデバイスでうまく動作します。
また、Xcode とプロジェクトのキャッシュと DerivedData ディレクトリをすべて消去しようとしました。プロジェクトとビルド フォルダーを消去し、プロジェクトを再構築しましたが、機能しません。Xcode のバージョンは 6.1 (6A1052d) で、OSX Yosemite 10.10.1 を使用しています。
私のコードを含む GitHub リポジトリ: https://github.com/papcio28/Typhoon-Dyld-Error
2014 年 11 月 21 日編集
また奇妙なのは、ファクトリを手動で作成し、何かを手動で注入すると、Typhoon が機能することです。私が行った手順は次のとおりです。
TyphoonInitialAssemblies
Info.plist からアイテムを削除しましたAppDelegate.application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
への変更func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let factory = TyphoonBlockComponentFactory(assemblies: [AppAssembly()]) factory.inject(self) return true }
しかし、ファクトリを手動で定義せずに Typhoon を使用したいという事実は変わらないので、質問はまだ現実的です。