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

Предположим, что такая настройка:

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

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

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

Ответ 1

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

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

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

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

  • Предпочтение "Построение местоположения" (в расширенных настройках "Местоположения" Xcode) не должно быть установлено в "Наследие".

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

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

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

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

Ответ 2

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

  • Создайте пустую игровую площадку и место где-то под вашим проектом.
  • Откройте YourPlayground.playground комплект (да, это каталог bundle =) в терминале.
  • Отредактируйте 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 и снова откройте Playground.
  • Теперь должны быть два раздела: один с содержимым вашего файла класса Swift, а другой - с содержимым примера, которое вы получили от создания игровой площадки с нуля.

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

Edit:

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

Ответ 3

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

import ModuleName

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

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

Внимание!

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

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

Я потратил час на то, чтобы понять это.:)

Ответ 4

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

Просто создайте игровое пространство в своем проекте, theres внутри него, называемый "sources", просто перетащите копию этого класса в эту папку, и игровая площадка будет иметь к ней доступ.

Например:

введите описание изображения здесь

Ответ 5

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

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

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

Xcode 8.2, Swift 3.0.1, macOS Sierra

Ответ 6

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

import ModuleName

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

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

  • Восстановите свой проект

  • Воссоздайте игровые площадки и скопируйте их со старой игровой площадки.

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