web-dev-qa-db-ja.com

独自のプロジェクトから独自のクラスをプレイグラウンドにインポートする方法

次のようなセットアップを想定します。

  • Objective-CとSwiftの両方で独自のクラス(MyViewやMyViewControllerなど)を実装したXcode 6プロジェクトがあります
  • プロジェクトにプレイグラウンドを追加しました

プレイグラウンドでは、UIKitキーワードを使用してimportなどのモジュール(フレームワーク)をインポートできます。プレイグラウンドからプロジェクトの他のクラスへのアクセスをどのように有効にしますか?

プロジェクトクラスに直接アクセスしようとすると、エラーメッセージが表示されます。未解決の識別子 'MyView'の使用

76

Xcode 6.0 Beta 5では、独自のフレームワークをプレイグラウンドにインポートできるようになりました。これにより、アプリケーションとプレイグラウンド間でコードを共有する方法が提供され、どちらもフレームワークをインポートできます。これをする:

  1. プレイグラウンドは、フレームワークを生成するプロジェクトと同じワークスペースにある必要があります。ワークスペースには、事前に構築されたフレームワークを使用する代わりに、フレームワークを生成するターゲットが含まれている必要があります。

  2. フレームワークをすでに構築している必要があります。 iOSフレームワークの場合、64ビットの実行先(iPhone 5sなど)用にビルドする必要があり、シミュレーター用にビルドする必要があります。

  3. 少なくとも1つのターゲットをビルドするアクティブなスキームが必要です(そのターゲットのビルド場所は、プレイグラウンドのフレームワーク検索パスで使用されます)。

  4. 「Xcodeの高度な「場所」設定での)「場所の構築」設定を「レガシー」に設定しないでください。

  5. フレームワークがSwiftフレームワークではない場合、[モジュールの定義]ビルド設定は[はい]に設定する必要があります。

  6. フレームワークのプレイグラウンドにimportステートメントを追加する必要があります。

これらの条件がすべて満たされると、フレームワークのインポートはプレイグラウンドで機能します。

Xcode 7では、フレームワークをインポートする代わりに、独自のクラスをソースとしてインポートするために使用できる別のメカニズムを導入しました。 http://help.Apple.com/xcode/mac/8.0/#/devfa5bea3af でこの「補助ソース」サポートについて読むことができます。

56
Rick Ballard

実際に、これを行うことで現在のプロジェクトの他のSwiftファイルを参照することができました。

  • 空のプレイグラウンドを作成し、プロジェクトの下のどこかに配置します。
  • ターミナルでYourPlayground.playgroundバンドル(はい、bundle =ディレクトリ)を開きます。
  • たとえばviを使用してcontents.xcplaygroundを編集し、次のような別のセクションを追加します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='3.0' sdk='iphonesimulator'> 
   <sections>
       <code source-file-name='section-1.Swift'/>
       <code source-file-name='section-2.Swift'/>
   </sections>
   <timeline fileName='timeline.xctimeline'/>
</playground>
  • section-1.Swiftの名前をsection-2.Swiftに変更します(Playgroundをゼロから作成した場合は、バンドルにsection-1.Swiftの例があります)
  • Swiftクラスファイルへのバンドルの外側を指すsection-1.Swiftという名前のハードリンク(シンボリックリンクは機能しないようです)を追加します:
ln ../../Classes/MyView.Swift section-1.Swift
  • Xcodeを閉じて、プレイグラウンドを再度開きます。
  • これで、2つのセクションが存在するはずです。1つはSwiftクラスファイルのコンテンツで、もう1つはPlaygroundを最初から作成したサンプルコンテンツです。

この方法で、実際にPlaygroundの外にあるコードを実行できますが、このようにするとXcodeが頻繁にクラッシュするようです。

編集:

Xcode 6ベータ5では、Rick Ballardが answer で指示しているように、プロジェクトファイルを参照できるようになりました。

17

Xcode 6のベータ5以降、フレームワーク内にある場合はコードをインポートできます。あなたがする必要があるのは、フレームワークターゲットを作成し、そこにSwiftファイルを追加し、あなたの遊び場で

import ModuleName

ビルド設定でモジュール名を検索できます。通常、ターゲット名と同じです。

publicを見たいコードを忘れずに作成してください。プレイグラウンドで変更が利用可能になる前に、プロジェクトをビルドする必要があります。 (プレイグラウンドを編集して再実行をトリガーする必要もあります。)

重要

プレイグラウンドファイルにターゲットと同じ名前を付けないでください!そうすると、インポートは機能しているように見えますが、プレイグラウンドが実行を試みると、次のエラーが表示されます。

プレイグラウンドの実行に失敗しました:エラー:シンボルを検索できませんでした:

私はそれを理解するのに1時間を無駄にしました。 :)

12
nschum

私はここの答えのいずれかを使用して動作させることができなかったので、遊び始めて、Swiftクラスを遊び場にインポートするための簡単な方法を見つけました。

プロジェクトにプレイグラウンドを作成し、その中に「sources」というディレクトリを作成し、Swiftクラスのコピーをそのフォルダーにドラッグするだけで、プレイグラウンドがアクセスできるようになります。

例:

enter image description here

10
de Raad

Sourcesフォルダー内のすべてのSwiftファイルへのリンクを配置するだけです。

cd /path/to/project/MyPlayground.playground/Sources
ln -s ../../*.Swift .

このようにして、ソースファイルの変更はすぐにプレイグラウンドで有効になります。 非常にうまく機能した

Xcode 8.2、Swift 3.0.1、macOS Sierra

3
qed