23

有一个带有函数定义的文件bar.swift

func bar() {
    println("bar")
}

以及一个以立即模式运行的脚本foo.swift

#!/usr/bin/xcrun swift -i
bar()

你如何从导入bar.swiftbar()功能foo.swift

4

2 回答 2

30

我认为现在的答案是,除非您编译代码,否则您不能将代码拆分到多个文件中。执行 with#!/usr/bin/swift仅适用于单个文件脚本。

在http://bugreport.apple.com/提交增强请求显然是个好主意,但同时您必须在执行代码之前编译代码。

此外,您的foo.swift文件不能具有该名称,您必须将其重命名为main.swift. 如果有多个文件被编译,那么只main.swift允许在顶层有代码。

所以,你有这两个文件:

main.swift:

bar()

bar.swift:

func bar() {
    println("bar")
}

并编译/执行代码:

$ swiftc main.swift bar.swift -o foobar

$ ./foobar 
bar

如果你所有的 swift 文件都在同一个目录中,你可以缩短编译命令:

$ swiftc *.swift -o foobar

或者,如果您想搜索子目录:

$ find . -iname '*.swift' | xargs swiftc -o foobar
于 2014-12-12T06:19:22.117 回答
0

编写一个 bash 脚本来连接文件。下面的脚本在执行之前将库文件预先挂在脚本的前面:

#!/bin/bash

cat $HOME/my_swift/my_library_to_add.swift $1.swift > t.swift
swift t.swift

由于生成的文件是一次性文件,您可以将其放在 RAM 驱动器上。这是根据需要创建或重复使用微型 1 Mb RAM 驱动器的更高级版本。

if [ ! -d /Volumes/swift_buffer ]; then
   diskutil erasevolume HFS+ 'swift_buffer' `hdiutil attach -nomount ram://2048`
fi

cat $HOME/my_swift/my_library_to_add.swift $1.swift > /Volumes/swift_buffer/t.swift   
swift /Volumes/swift_buffer/t.swift

这将创建一个容量仅为 1 Mb 的微型 RAM 驱动器,足以容纳任何实用程序脚本和简单的库。

安装的 RAM 驱动器将在 Finder 中可见,可以从中弹出。我不会直接在脚本中处理它,因为分配需要时间。

于 2017-07-14T15:05:22.287 回答