如何将自己的类从自己的项目导入到操场
-
21-12-2019 - |
题
假设这样的设置:
- 改名的是6个项目,你已经用Objective-C和Swift实现了自己的类(比如MyView和MyViewController)
- 您已经在项目中添加了一个游乐场
在操场上,可以导入模块(框架),如 UIKit
与 import
关键字。如何启用从Playground访问项目的其他类?
只是尝试直接访问项目类会导致错误消息:未解析标识符'MyView'的使用
解决方案
改名为6.0beta5,现在可以将自己的框架导入到操场中。这提供了一种在应用程序和playgrounds之间共享代码的方法,它们都可以导入框架。要做到这一点:
您的playground必须与生成框架的项目位于同一个工作区中。您的工作区必须包含生成框架的目标,而不是使用预构建的框架。
你必须已经建立了你的框架。如果它是iOS框架,则必须为64位运行目标构建(例如iPhone5s),并且必须为模拟器构建。
您必须有一个至少构建一个目标的活动方案(该目标的构建位置将在操场的框架搜索路径中使用)。
您的"构建位置"首选项(在Xcode的高级"位置"设置中)不应设置为"旧版"。
如果您的框架不是Swift框架,则"Defines Module"构建设置必须设置为"Yes"。
您必须为框架添加一个import语句到您的playground。
一旦满足所有这些条件,导入您的框架将在游乐场中工作。
在Xcode7中,我们引入了另一种机制,您可以使用它来导入自己的类作为源,而不是导入框架;您可以在以下网址阅读有关此"辅助源"支持的信息 http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af
其他提示
我实际上设法通过这样做来引用当前项目中的其他Swift文件:
- 创建一个空的操场和地方是在你的项目的某个地方.
- 打开
YourPlayground.playground
终端中的bundle(是的,它是一个bundle=directory)。 - 编辑
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在这样做时似乎更频繁地崩溃。
编辑:
改名为6beta5,你现在可以引用项目文件,正如Rick Ballard在他的 回答.
改名的方法是在框架中导入代码。你需要做的是创建一个框架目标,在那里和你的操场上添加Swift文件
import ModuleName
您可以在构建设置中查找模块名称。它通常与目标名称相同。
记得制作你想看的代码 public
.在操场上有可用的更改之前,您需要构建项目。(您还需要编辑playground以触发重新执行。)
重要事项
不要给操场文件与目标相同的名称!如果你这样做,导入似乎工作,但当操场尝试执行时,你会得到以下错误:
游乐场执行失败:错误:无法查找符号:
我浪费了一个小时来弄清楚这一点。:)
我只是把我所有的swift文件的链接放在 Sources
文件夹:
cd /path/to/project/MyPlayground.playground/Sources
ln -s ../../*.swift .
这样,源文件中的更改将立即在您的playground中生效。 工作得很好.
Xcode8.2,Swift3.0.1,macOS Sierra
所有你需要做的-是写在开始:
import ModuleName
(假设您的playground放置在与framework/project相同的工作空间中)
如果它不起作用:
重建你的项目
重新创建操场和复制所有从旧操场那里
它解决了很多奇怪的问题 init和导入失败的错误 不管怎样!