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

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

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Редактировать:

Начиная с бета-версии Xcode 6 вы теперь можете обращаться к файлам проекта, как указывает Рик Баллард в своем ответе.

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

import ModuleName

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

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

Важный

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

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

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

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

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

Например:

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

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

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

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

Xcode 8.2, Swift 3.0.1, macOS Sierra

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

import ModuleName

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

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

  1. Перестрой свой проект

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

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

Другие вопросы по тегам