如何将第三方框架导入Xcode Playground?

46

我该如何将第三方框架导入Xcode Playground?

显然,Swift Playground有一个框架导入机制,因为我们可以导入 Cocoa, SpriteKit,在OSX Playground中还可以导入XCPlayground(奇怪的是,在iOS中似乎缺少XCPlayground)。

我真正想做的是隐藏我的Playground代码并展示一个最小化的例子。有没有关于如何在Swift Playground中加载框架的想法?

另请参见:

(这个问题不同,因为请求使用框架而不仅仅是普通的swift文件)


如果向 Xcode 项目添加游乐场,并且该项目已链接了框架,那么是否能正常工作?目前我手头没有 Xcode 6,但其他人在其他问题中已经开始讨论该方法了。 - Jiaaro
@Jiaaro 它适用于“标准”框架,但我无法使其适用于自定义框架。 - Nate Murray
1
在 REPL 中怎么样? - Jiaaro
有人成功地将Parse框架导入Playground吗? - Phil Andrews
6个回答

46

目前没有支持将自己的框架或应用程序代码导入到游乐场的官方方法,除非将其粘贴到游乐场编辑器中。我们知道这是非常理想的功能,但我们仍然鼓励用户通过bugreport.apple.com提供反馈意见。

如果您只是想隐藏示例中的代码,那么编辑器中的代码折叠可能会起到一定作用。

现在可以将自己的框架导入到游乐场中。这为在您的应用程序和游乐场之间共享代码提供了途径,二者都可以导入您的框架。要做到这一点,您的游乐场必须与生成您的框架的项目位于同一工作区中。您必须已经构建了您的框架。如果它是一个iOS框架,它必须为64位运行目标(例如iPhone 5s)构建。您必须有一个活动方案,该方案至少构建一个目标(该目标的构建位置将用于游乐场的框架搜索路径)。您的“构建位置”首选项(在高级“位置”设置中)不应设置为“Legacy”。如果您的框架不是Swift框架,则必须将“Defines Module”构建设置设置为“Yes”。一旦满足所有这些条件,导入框架将在游乐场中工作。


1
在 REPL 中是否可能? - frankodwyer
1
有没有任何支持在游乐场指定自定义构建设置的地方?特别是,我需要在导入搜索路径中指定一个自定义module.map。我的自定义module.map对于从Swift访问sqlite是必要的。 - Christian Niles
如果你仍然遇到问题,可能是因为你没有将playground设置在正确的平台上。从项目导航器中打开你的playground文件。现在按下Option+Command+1来显示工具。确保你选择了与你的导入匹配的iOSOS X图片 - Stefan Arambasich
这需要一个动态框架吗?我刚刚尝试设置游乐场以导入我的静态库目标,但它没有起作用。 - Lily Ballard

19

编辑:从Beta5开始,当playground作为构建框架的目标的一部分时,它已支持此功能。Apple开发者论坛网站上有更多详细信息,但希望@Rick Ballard将它们添加到他的回答中,这应该成为这个问题的确定性答案。

不要再执行下面的操作!


暂时而言,在没有支持的解决方案的情况下,如果您要生成一个模块/框架,可以将其复制到SDK的System/Library/Frameworks目录中,然后像导入系统框架一样仅需import <#Module#>即可。

对于OS X Playground:/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks

对于iOS:/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks/

但在执行此操作之前,请按照@Rick所说的在radar上进行报告。


2

我写了一篇关于在Beta 6中导入自定义框架的教程

简单来说,如果你把你的playground和框架放在同一个项目或工作区里,并且你的框架是为64位(即使是iOS)构建的,它们将非常好地配合使用。


那么在你的教程中,这个要求是不必要的:“……当游乐场是构建框架作为目标的工作区的一部分时。”? - Sentry.co

1
我通过将构建的框架复制到“Built Products”目录中来解决了问题,Playgrounds在工作区中也会搜索这些框架。注意:您还需要运行lipo并从FAT二进制文件中剥离未使用的架构。
需要的步骤(简述):
- 创建聚合目标 - 添加脚本阶段以将框架从Carthage / Build / iOS /复制到BUILT_PRODUCTS_DIR(在下面的示例中,我使用了一个swift脚本,但您也可以使用bash、ruby python等) - 运行聚合目标现在您可以在Playground中导入框架
此外,您还可以在应用程序中利用聚合目标:
- 从BUILT_PRODUCTS_DIR嵌入框架,而不是Carthage / Build / iOS / - 将聚合目标添加到应用程序方案以在清除后重新建立框架。
以下是设置示例项目:https://github.com/richardnees/CarthagePlaygrounds

尝试在此处提供大部分答案,并仅将链接用作参考。 - M--
什么是聚合目标? - mmmmmm

1

来源: http://qiita.com/ryokosuge/items/2551cd4faa9dca324342

如果有人在阅读了已接受的答案后仍然难以理解如何操作,那么这篇文章可能会对你有所帮助。

以下是使用Carthage的步骤:

1: 在项目根目录下设置Cartfile, 添加库并运行:

carthage update --platform iOS --use-submodules

2: 确保你的项目被保存为一个Workspace。从Xcode菜单栏中选择:文件 > 另存为工作区。关闭Xcode并从新的.xcworkspace文件重新打开。

3:在工作区中添加您的库的.xcodeproj文件:文件 > 将文件添加到“your_workspace_name”。然后在此处找到它:${SRCROOT}/Carthage/Checkouts/your_library_name/your_library_name.xcodeproj

4:在项目的常规设置中找到嵌入式二进制文件链接的框架和库部分。将您的库的.framework文件添加到两个部分。

5:清理(⇧+⌘+K)并构建(⌘+B)。

6:在playground中导入您的库。


0

就像在Swift代码中使用Objective-C类一样,您可以将第三方库/类导入到您的项目中,Xcode会询问您是否要创建一个<#YourProjectName>-Bridging-Header头文件。选择是并在该文件中导入所有需要的头文件。之后,在您的playground中,您只需在import UIKit之后执行import <#YourProjectName>-Bridging-Header,然后您就可以使用导入到您的项目中的类了。

更新:这实际上是不正确的。请参见下面我的评论。对于任何混淆感到抱歉...


实际上,这种技术行不通。我的一个苹果工程师朋友告诉我,它目前不受支持。 - auser
你说得对...当我尝试时,Xcode没有显示错误。但是在我重新打开项目后出现了一个错误。 - Peng90
1
@Peng90,你能否编辑一下你的回答,支持一下你所发现的内容?你真的让我很兴奋,但最终却让我失望了。为了避免其他人只是浏览答案就产生错误的想法,请你修改一下。 - Tibor Udvari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接