如何将自己的项目从自己的项目导入Playground


77

假设这样的设置:

  • 您有一个Xcode 6项目,在这里您已经用Objective-C和Swift实现了自己的类(例如MyView和MyViewController)
  • 您已经在项目中添加了Playground

在操场上,有可能导入模块(框架),如UIKitimport关键字。您如何从Playground启用对项目其他班级的访问?

尝试直接访问项目类会直接导致错误消息: 使用未解析的标识符“ MyView”


1
希望此问题有最新答案(7.3+)
特拉维斯·格里格斯


请检查以下问题并回答:stackoverflow.com/questions/28301662/…–
FreeSoul

Answers:


57

从Xcode 6.0 Beta 5开始,现在可以将自己的框架导入操场。这提供了一种在应用程序和Playground之间共享代码的方法,可以同时导入您的框架。去做这个:

  1. 您的游乐场必须与生成框架的项目位于同一工作空间中。您的工作区必须包含生成框架的目标,而不是使用预先构建的框架。

  2. 您必须已经构建了框架。如果它是iOS框架,则必须为64位运行目标(例如iPhone 5s)构建,并且必须为模拟器构建。

  3. 您必须具有一个主动方案,该方案可以构建至少一个目标(该目标的构建位置将在游乐场的框架搜索路径中使用)。

  4. 您的“构建位置”首选项(在Xcode的高级“位置”设置中)不应设置为“旧版”。

  5. 如果您的框架不是Swift框架,则必须将“定义模块”构建设置设置为“是”。

  6. 您必须在框架的操场上添加导入语句。

一旦满足所有这些条件,导入框架即可在操场上进行。

在Xcode 7中,我们引入了另一种机制,您可以使用该机制将自己的类作为源导入,而不是导入框架。您可以在http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af中阅读有关“辅助源”支持的信息


“游乐场支持导入框架。” XCode 6 beta 5更改日志
Albert Bori 2014年

109
要复杂。苹果应该使它变得更容易。
拉米斯2014年

6
因此,不可能从应用程序目标导入类吗?
bilby91 2014年

5
这似乎在Xcode 6.1中不起作用。我遵循了Ballard的上述要求,这些要求在此处作为教程回显,并且操场上的import语句引发错误。
ybakos 2014年

4
请注意:您必须构建Simulator二进制文件。建筑设备二进制文件无效。(Xcode版本6.3.2(6D2105))
2015年

18

通过这样做,我实际上设法引用了当前项目中的其他Swift文件:

  • 创建一个空的Playground,并将其放置在项目下的某个位置。
  • 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.swiftsection-2.swift(如果从头开始创建Playground,则section-1.swift捆绑包中应该有一个示例)
  • 添加一个名为的硬链接(符号链接似乎不起作用)section-1.swift,该链接将在捆绑包之外指向您的Swift类文件,例如:
ln ../../Classes/MyView.swift section-1.swift
  • 关闭Xcode,然后再次打开Playground。
  • 现在应该有两个部分,一个部分包含您的Swift类文件的内容,另一部分包含您从头开始创建Playground所获得的示例内容。

这样,我实际上可以在Playground外部运行代码,但是这样做时Xcode似乎更经常崩溃。

编辑:

从Xcode 6 beta 5开始,您现在可以引用项目文件,如Rick Ballard在他的答案中所述


1
请注意,这将导致同一文件在两个位置出现并可以编辑。如果添加style='setup'<code>标签,它将显示为可折叠/可扩展的块,可能更理想,因为它在某种程度上隐藏了多余的文件。
Christopher Swasey 2014年

12

从Xcode 6的Beta 5开始,可以将您的代码导入框架中。您需要做的是创建一个框架目标,在其中添加Swift文件,然后在您的操场上

import ModuleName

您可以在构建设置中查找模块名称。通常与目标名称相同。

记住编写您想看的代码public。您需要先构建项目,然后才能在操场上进行更改。(您还需要编辑操场以触发重新执行。)

重要

不要给游乐场文件指定与目标相同的名称!如果这样做,导入似乎可以正常工作,但是在游乐场尝试执行时会出现以下错误:

游乐场执行失败:错误:无法查找符号:

我花了一个小时才弄清楚这一点。:)


命名提示是我的问题。非常感谢!
mxcl 2014年

2
提示:无需将符号声明为public。只需将您的进口商品标记为@testable import ModuleName
约翰·埃斯特罗皮亚'17

10

我无法使用此处的任何答案来使它正常工作,所以我开始玩耍,发现了一种简单的方法,对我来说,将快速班级导入操场是可行的。

只需在您的项目中创建一个Playground,在其中有一个名为“ sources”的目录,只需将swift类的副本拖到该文件夹​​中,然后Playground就可以访问它。

例如:

在此处输入图片说明


4
这对我有用。对于其他菜鸟,请记住还要确保声明public要在操场上使用的东西。developer.apple.com/library/ios/documentation/Swift/Conceptual / ...-我尚未找到一种Swift资源,可以弥补学习Swift(简单)和实际在XCode中组织Swift项目之间的鸿沟(到目前为止非常不直观) 。
danneu '16

4

我只是将指向我所有swift文件的链接放在该Sources文件夹中:

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

这样,源文件中的更改将立即在您的游乐场中生效。做得非常好

Xcode 8.2,Swift 3.0.1,macOS Sierra


返回“没有目录的此类文件”。您能帮忙吗
ZaEeM ZaFaR

-1

所有您需要做的-首先写:

import ModuleName

(假设您的游乐场与框架/项目位于同一工作区中)

如果不起作用:

  1. 重建项目

  2. 重新创建游乐场并从那里的旧游乐场复制所有内容

它通过失败的init和任何东西的导入解决了许多奇怪的错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.