执行嵌入到一行终端命令中的 Swift 代码

3

我知道有Swift REPL和Xcode playgrounds,但我想知道是否有一种替代ruby -e "<code>"sh -c "<code>"的Swift方法,其中给定的单行代码将作为命令的结果执行?

2个回答

6

没有直接的等价物(你可以使用 swift --help 命令查看其选项,发现没有类似 Ruby 的 -e 选项)。

但是有一种解决方法。

你可以使用 echo|(管道符号)将 Swift 表达式直接传递给编译器,如下所示:

echo "print(42)" | swift

结果:

欢迎使用苹果Swift 2.1.1版本(“700.1.101.9 700.1.78”)。键入:help获取帮助。
42

我猜这就是你想要的行为。

我们注意到它总是打印介绍语句,但有一种方法可以解决这个问题,只需在命令结尾添加-即可,如下所示:

echo "print(42)" | swift -

结果:

42

在使用字面字符串时,需要转义双引号:

echo "print(\"hello\")" | swift -

结果:

你好

您可以执行任何表达式,甚至循环:

echo "for num in 1...5 { print(num) }" | swift -

结果:

1
2
3
4
5

等等。

这仍然是REPL,因此它将反馈有关变量的信息(省略末尾的-技巧),例如:

echo "let x = 42;print(x)" | swift

结果:

欢迎使用苹果Swift 2.1.1版本(“700.1.101.9 700.1.78”)。输入 :help 获取帮助。
42
x: Int = 42


1
从Swift 5.8版本开始,您现在可以使用swift -e直接从命令行运行代码。
bash-3.2$ swift --help | grep -e "-e "
  -e <value>              Executes a line of code provided on the command line

bash-3.2$ swift -e 'print("fofo")'
fofo

bash-3.2$ swift -e 'import Foundation ; var users = ["zoe", "joe", "albert", "james"] ; for user in users {  print(user) }'
zoe
joe
albert
james
bash-3.2$

1
这似乎是从Swift 5.8开始的正确答案。 - Lukáš Kubánek

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