Swift REPL:如何导入、加载、评估或要求一个 .swift 文件?

29
在Swift REPL中,如何导入(也称为加载、评估、要求)一个典型的文本*.swift文件?
  • 我想使用这个文件中的代码:~/src/Foo.swift

  • 类似于这样的语法是不起作用的:import ~/src/Foo.swift

与之比较:

  • 在Swift REPL中,一个框架的等效解决方案是:import Foundation

  • 在Ruby REPL中,*.ruby文件的等效解决方案是:require "~/src/foo"

以下是类似但不是我所问的问题:

  • 如何使用/创建Swift命令行脚本、可执行文件、模块等。

  • 如何使用/创建XCode playground、项目、库、框架等。

  • 如何启动带有预先存在的文件列表的REPL。

6个回答

6

您需要使用-I选项,如果您的modulename.swiftmodule文件在~/mymodules中,则启动swift时请使用该选项。

swift -I ~/mymodules

然后你就可以导入你的模块了

import module name

应该很容易。

谢谢,我正在寻找一种方法来在Swift REPL中包含.swift源代码,而且不需要任何特殊的启动。与Ruby相比,我们可以像这样读取源代码并进行评估:require '/foo/bar/mycode.rb'。 - joelparkerhenderson
哦,我的错误...抱歉...您需要动态执行此操作吗(即加载字符串,然后“要求”它),还是在“启动时间”就已经知道所需的导入文件? - rougeExciter
动态地。就像 Ruby、Python、Perl 等语言一样,让我在 REPL 中随时需要任意文件路径。 - joelparkerhenderson
1
那么在这个阶段,很明显是不行的。除非将文件编译成一个模块,然后将其放置在正确的包含和库路径中。 - rougeExciter

3

在Swift中,你不能导入一个典型的*.swift文件。

Import Declaration只能使用以下语法:

“ ‌ import-declaration → attributesopt import import-kindopt import-path
import-kind → typealias| struct| class| enum| protocol| var| func
‌ import-path → import-path-identifier| import-path-identifier.import-path
‌ import-path-identifier → identifier| operator”

来源:Apple Inc. “The Swift Programming Language (Swift 2)”。 iBooks。

可以描述为以下格式:

import module
import import kind module.symbol name
import module.submodule

import head.swiftimport import-kind module.symbol-name不兼容。


通常编译要导入的文件作为框架。然后它可以被视为一个模块。使用-F framework_directory/指定第三方框架的搜索路径。

  1. 创建一个文件。例如:

    // test.swift import headtest print("Hello World")

  2. 打开终端

  3. 进入创建文件的目录。
  4. 执行命令行

    swift -F headtest test.swift

完成。


非常有帮助,谢谢。在我的问题得到正面答复之前,我会尝试您的方法。非常感激。 - joelparkerhenderson
你能否编写一个函数,它接受一个路径作为参数,将其编译并动态地导入吗?然后每次启动 REPL 时都包含该函数? - DylanYoung

2

现在Swift REPL支持包。我们可以通过以下步骤完成:

  1. 在Xcode中,选择菜单File > New > Package。为包选择一个名称,例如MyLibrary。

  2. 将你的代码或.swift文件复制到包中Sources/MyLibrary/目录中。

  3. 记得将接口设为 public

  4. 在命令行中,进入包目录并运行REPL。

像这样

cd MyLibrary/
swift run --repl
  1. 在REPL中导入你的库

像这样:

import MyLibrary

现在你可以在REPL中运行你的代码。

1

只需要在你的脚本顶部插入shebang行:

#!/usr/bin/env xcrun swift

谢谢回答。我想要的是一种将文件代码加载到REPL中的方法;我不是在寻找使文件代码可执行的方法。我会澄清我的问题。- Joel - joelparkerhenderson
虽然有些过度,但是你可以构建一个动态库并将其加载到REPL中。 - Vatsal Manot
谢谢Vatsal。是的,那是个好主意,如果这里没有人能提供将纯文本加载到REPL中的解决方案,那就是我的备选方案。我会进一步澄清我的问题。再次感谢! - joelparkerhenderson
我正在研究这个问题。但是,如果可以的话,请考虑使用Xcode构建一个适当的框架,然后将其加载到REPL中。 - Vatsal Manot
可能对于这个特定的问题并没有帮助,但是了解这一点非常有用。在某些情况下,能够以这种方式从脚本中调用各种本地代码是一个非常好的选择。 - jkp

1
你可以将源代码复制/粘贴到repl中并执行。 显然不是最理想的,但有时很有用。

0

看起来使用您提供的规范无法导入文件并让Xcode使用REPL。我认为您仍然可以通过创建适当的框架来实现它,但这不是您一开始想要的确切功能。


谢谢,我正在寻找使用我在问题中提供的规格的答案。 - joelparkerhenderson

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