Как импортировать собственные классы из собственного проекта на игровую площадку


предположим, что настройка выглядит следующим образом:

  • у вас есть проект Xcode 6, где вы реализовали свои собственные классы (скажем, MyView и MyViewController) с Objective-C и Swift
  • вы добавили детскую площадку в свой проект

на игровой площадке можно импортировать модули (фреймворки), такие как UIKit с import ключевое слово. Как вы разрешаете доступ к другим классам проекта с игровой площадки?

просто для прямого доступа к классам проекта выводится сообщение об ошибке: использование неразрешенного идентификатора 'MyView'

6 71

6 ответов:

начиная с Xcode 6.0 Beta 5, Теперь можно импортировать свои собственные фреймворки на игровую площадку. Это обеспечивает возможность совместного использования кода между приложениями и игровыми площадками, которые могут импортировать ваши фреймворки. Для этого:

  1. ваша игровая площадка должна находиться в том же рабочем пространстве, что и проект, который создает ваш фреймворк. Рабочая область должна содержать целевой объект, который создает фреймворк, а не использовать предварительно созданный фреймворк.

  2. вы должно быть, вы уже построили свой фреймворк. Если это платформа iOS, она должна быть построена для 64-разрядного назначения запуска (например, iPhone 5s) и должна быть построена для симулятора.

  3. У вас должна быть активная схема, которая строит хотя бы одну цель (расположение сборки этой цели будет использоваться в пути поиска фреймворка для игровой площадки).

  4. ваше предпочтение "Build Location "(в расширенных настройках" Locations "Xcode) не должно быть установлено на"Legacy".

  5. Если ваш фреймворк не является фреймворком Swift, параметр сборки " Defines Module "должен быть установлен в"Yes".

  6. вы должны добавить оператор импорта на свою игровую площадку для фреймворка.

Как только все эти условия будут выполнены, импорт вашего фреймворка будет работать на игровой площадке.

в Xcode 7 мы ввели еще один механизм, который можно использовать для импорта собственных классов в качестве источника, а не импорт фреймворка; вы можете прочитать об этой поддержке "вспомогательных источников" в http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af

мне действительно удалось обратиться к другим Swift-файлам в текущем проекте, сделав это:

  • создать пустую площадку и место находится где-то под вашим проектом.
  • открыть YourPlayground.playground bundle (да, это bundle = каталог) в терминале.
  • Edit contents.xcplayground например vi и добавить еще один раздел такой:
<?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 (если вы создали Детская площадка с нуля, должен быть пример section-1.swift в комплект)
  • добавить ссылка (символическая ссылка не работает) с именем section-1.swift который будет указывать за пределами пакета на ваш файл класса Swift, например:
ln ../../Classes/MyView.swift section-1.swift
  • закройте Xcode и снова откройте игровую площадку.
  • теперь должно быть два раздела, один с содержимым вашего файла класса Swift, а другой с примером контент вы получили от создания игровой площадки с нуля.

таким образом, я могу фактически запускать код, лежащий за пределами игровой площадки, но Xcode, похоже, чаще падает, когда делает это так.

Edit:

начиная с Xcode 6 beta 5 Теперь вы можете ссылаться на файлы проекта, как Рик Баллард инструктирует в своем ответ.

начиная с бета-версии 5 Xcode 6 можно импортировать ваш код, если он находится в рамках. Что вам нужно сделать, это создать целевой фреймворк, добавить файлы Swift там и на вашей игровой площадке do

import ModuleName

вы можете посмотреть имя модуля в настройках сборки. Обычно это то же самое, что и имя цели.

Не забудьте сделать код, который вы хотите увидеть public. Вам нужно будет построить проект до того, как изменения будут доступны на игровой площадке. (Вам также нужно будет отредактировать площадка для запуска повторного выполнения.)

важно

Не давайте файлу playground то же имя, что и целевой! Если вы это сделаете, импорт, кажется, работает, но вы получите следующую ошибку, когда площадка пытается выполнить:

не удалось выполнить Playground: ошибка: не удалось найти символы:

Я потратил час на выяснение этого. :)

Я не смог заставить его работать, используя любой из ответов здесь, поэтому я начал играть и нашел простой способ, который работал для меня, чтобы импортировать быстрый класс на игровую площадку.

просто создайте игровую площадку в своем проекте, внутри нее есть каталог под названием "Источники", просто перетащите копию класса swift в эту папку, и тогда игровая площадка будет иметь доступ к ней.

например:

enter image description here

Я просто поставил ссылки на все мои swift файлы в :

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

таким образом, изменения в исходном файле вступят в силу на вашей игровой площадке немедленно. работал очень хорошо.

Xcode 8.2, Swift 3.0.1, macOS Sierra

все, что вам нужно сделать - это написать в самом начале:

import ModuleName

(предполагая, что ваша игровая площадка размещена в том же рабочем пространстве, что и framework / project)

если это не работает:

  1. перестроить проект

  2. воссоздать площадку и скопировать все из старой игровой площадки там

он решает много странных ошибки с неудачным инициализацией и импортом of все равно!