質問: お世話になります。 現在、サードパーティーKeyboardアプリを作成中の者です。C++は素養がほぼありません。Objective-Cは基本だけわかる初心者です。よろしくお願いします。 Swiftにてコーディングしておりますが、Mozc for iOSを導入したいと願っています。 現状、「Google CGI API for Japanese Input」を利用して、サーバアクセスをし、変換候補を取得して簡易的に漢字変換を実装していますが、ローカルのMozcで実装できればと思いながら、実現できずにおります。 JapaneseKeyboardKitのコードを拝見し、実機デモも行い、学習させていただいています。 しかし、Objective-Cから、Swiftへの移植で困難を覚えています。 特に現状では、SwiftへのC++のライブラリの取り込み方法がわからず、躓いております。 実装準備として、JapaneseKeyboardKitのコードからお借りして、 inputCandidate.h inputManager.h の二つのヘッダファイルを、keyboard-bridging-header.hで#importし、 inputCandidate.mm inputManager.mm もkeyboardアプリに配置し、 Mozc-for-iOS/src/out_ios/Release-iphoneos配下の すべてのC++ライブラリ群をLink Binary with Libraryに登録致しました。 しかし、imputManager.mmファイル30行目あたりの ``` #include "composer/composer.h" ``` の部分で、 「file not found」 エラーが出て、先に進めずにおり弱っております。 「composer.hというC++のファイルにアクセスできていないようだな」とは思うのですが、 ブリッジングヘッダーでC++をObjective-Cでラップした前記2つのhファイルをimportし、 読み込ませているつもりですが、どうcomposer/composer.hにアクセスできるのかわかりません。 Objective-Cを覚えて、現在Swiftで書いているkeyboardアプリのコードを書き直すか、 Swiftでの実装が可能ならば、Swiftのままで行くか悩んでおります。 これはMozc for iOSに関する質問というより、C++ライブラリのSwiftでの利用に関する質問かと思いますし、初歩的な質問かもしれませんが、ネット上でC++のライブラリ導入に関しての情報が少な目(自分には十分理解できず)ですので、ヒントがありましたら、どうぞよろしくお願いいたします。
回答: `composer.h` が見つからないのはおそらくSwift関係なく、プロジェクトの`HEADER_SEARCH_PATH`の設定が正しくできていないのだと思います。Bridgingヘッダや、Swiftのコードがなくても同じエラーが出るのではありませんか?まず単にコードをコピーしただけのプロジェクトでビルドできるかどうか確認してみましょう。 それはともかく、Swiftは今のところ、C++のコードと直接の互換性はないので、CかObjective-Cでラップする必要があります。SwiftからはラップしたCやObjective-Cを直接呼び出すことになります。 例えば、JapaneseKeyboardKitはMozcのコードをObjective-CとObjective−C++でラップしていますので、そのコードはSwiftから呼び出すことができます。 JapaneseKeyboardKitの`InputManager`クラスのAPIをSwiftから使う場合を説明します。 JPKBターゲットに`Manager.swift`というファイルを追加します。そのとき、Bridgingヘッダを追加するかどうかXcodeが聞いてくると思うので、追加します。 Bridgingヘッダに次のように`import`文を追加します。 ``` #import "InputManager.h" ``` これだけで`Manager.swift`から`InputManager`のコードが扱えるようになるので、 ``` import UIKit class Manager: NSObject { func requestCandidates(forInput input: String) { let manager = InputManager() manager.requestCandidatesForInput(input) ... } } ``` 上記のようにSwiftでコードを書いていきます。 まとめると、Swiftから直接Mozcのコードを扱うことはできません。Objective-CまたはCでラップする必要があります。なので、アプリの大部分はSwiftで書くにしても、少しはObjective−CあるいはCを覚えて、書く必要があります。