質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1438閲覧

SwiftのDelegateでビルドエラーを解消する方法ご存知無いでしょうか?

tpro

総合スコア27

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/12/20 10:22

編集2017/12/20 15:12

ご覧くださりありがとうございます。

Xcodeで"Cannot find protocol declaration for ○○delegate"というエラーが解消できません。どなたか方法をご存知無いでしょうか?
「その方法では無理」「SwiftではなくObjective-Cなら可能」など、解決に至らなくても何か情報あれば大変助かります。
よろしくお願いします。

開発環境:
Swift:3.2, Xcode:9.2, Unity:2017.3.0f1, iOS:11.2.1

###前提
SwiftでUnityのNativeプラグインを作成しようとしています。
こちらのサイトの内容通りにプラグインを作る事はでき、iPhone実機でも問題なく動きました。

###まず実現したいこと
上記URLのCameraRollViewController.swiftに追加でARKitをimportして、クラス宣言にARSessionDelegateを追加するとそれだけで画像のようにビルドエラーが発生するので解消したいです。
CameraRollViewController

###調べたこと

  • XcodeのBuild Settings -> Objective-C Generated Interface Header Name

に入れるProjectName-Swift.h(Xcodeで自動生成)には画像のエラーが表示されます。
ProjectName-Swift.h

  • ARSessionDelegateで右クリック->Jump to Definitionでprotocolの定義に飛ぶ事はできてます
  • ARSessionDelegateではなくMetalKitをimportしてMTKViewDelegateを追加しても同様のビルドエラーが発生します。

###その他
Xcode自動生成のヘッダーファイルコードをgithubに置きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cannot find protocol declarationでググってみたら循環参照が原因らしいので、循環参照を解消して下さい。

投稿2017/12/21 00:44

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tpro

2017/12/21 03:42

情報ありがとうございます。 上記「前提」に記載させて頂いたように、問題なくビルドできた状態からの変更点はARKitのimportとDelegationの追記だけですので、 自作クラスのインスタンスが違いに参照し合っているとかそういった記述はしておりません 回答ありがとうございます
fuzzball

2017/12/21 03:51 編集

エラーのところに表示されている CameraRollSample/... の先(ファイル名?)がどうなっているか教えて下さい。これも自作クラスですか?
tpro

2017/12/21 04:23

CameraRollSample/camerarollsample/Libraries/Plugins/iOS/CameraRollViewControllerPlugin.mm:1: となっております。中身全文 ------- #import <GetDepthSample-Swift.h> extern "C" { void OpenCameraRoll(const char *path) { CameraRollViewController *cameraRollViewController = [CameraRollViewController new]; [UnityGetGLViewController() addChildViewController:cameraRollViewController]; [cameraRollViewController open:[NSString stringWithUTF8String:path]]; } }
fuzzball

2017/12/21 05:32

CameraRollViewControllerPlugin.mm に #import <ARKit/ARKit.h> を追加するとどうでしょうか?
tpro

2017/12/21 05:43

ご返信ありがとうございます。 やってみましたが、エラー内容変わりありませんでした...
fuzzball

2017/12/21 05:56

あ、#import <ARKit/ARKit.h> は #import <GetDepthSample-Swift.h> より上に書いて下さい。 それでもダメなら、オマジナイっぽくて申し訳ないですが、 ・クリーンする。(Shift + Command + Option + K) ・Xcodeを起動し直してビルド。 をお願いします。
tpro

2017/12/21 06:28

エラー解消してビルド通りました...!! ARSessionから値がちゃんと取れるか確認してみます。 ありがとうございます! 取り急ぎご報告まで
tpro

2017/12/21 10:29 編集

CameraRollViewController.swiftを改変してみたのですがARSessionから値を取得する事が出来ませんでした。 リアカメラ起動してARSesssionをrunさせるところまでは出来たのですが、 didUpdateでframeを取得する処理が走りませんでした。 別スレで新たに質問投稿の方が良いかもしれませんが、こちらにも書かせて下さい... 改変後CameraRollViewController.swift コード全文 ——- import UIKit import ARKit @available(iOS 11.0, *) public class CameraRollViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate{ var sceneView = ARSCNView() override public func viewDidLoad() { super.viewDidLoad() UIApplication.shared.isIdleTimerDisabled = true sceneView.session.delegate = self sceneView.automaticallyUpdatesLighting = true } override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let configuration = ARWorldTrackingConfiguration() sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors]) //ARSCNView描画 self.view.addSubview(sceneView) sceneView.translatesAutoresizingMaskIntoConstraints = false sceneView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true sceneView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true sceneView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true sceneView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true }   //フレーム取得(これが実行されない) public func session(_ session: ARSession, didUpdate frame: ARFrame) { print("Frame Get!") } override public func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
tpro

2017/12/21 13:38

fuzzballさん この度はご回答ありがとうございました。 今回のビルドエラーはARSessionのみならずMetalKitに関しても、ご教示頂いた同様の確認方法で回避する事ができました。 上記の新たな問題については別途質問を設けてみます。 この度はありがとうございました、とても助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問