我有这些非常简单的代码行:
var friends = ["Mike", "Marika", "Andreas", "Peter", "Sabine"]
friends.map{
println("Hallo \($0)!")
}
这在程序中工作正常,但我在操场上没有输出。 它只告诉我元素的数量和运行需要运行的次数。但它没有写出字符串。
是我还是Xcode中的错误?
答案 0 :(得分:4)
这不是Xcode中的错误。虽然您的map
代码将打印到标准输出(点击cmd-opt-enter以在右侧的助理编辑器中显示输出),但在风格上您应该避免使用map
。使用for...in
循环会更好:
for friend in friends {
println("Hallo \(friend)")
}
如果您这次快速查看结果,您会看到更有帮助的结果:
(请注意,我已将快速查看切换到列表视图,其中显示了每个结果,而不仅仅是最后一个结果)
为什么这种方式有所不同?这是因为map
并不是真正针对你的数组运行任意代码。它更具体地用于将转换(即映射)您的数组到另一个数组中。因此,假设您不想打印朋友列表,而是想要一个问候列表,您可以这样做:
let greetings = friends.map { friend in
"Hallo \(friend)"
}
greetings
现在将设置为一个包含5个字符串的新数组,每个字符对应一个"Hallo <name>"
形式。 map
正在接受一个带字符串的闭包,并将其映射到一个新字符串。
因此,当您编写friends.map { println("...") }
时,map
正在调用闭包,并在闭包中获取表达式的结果,并使用它填充新数组。由于println
返回Void
,因此每次该表达式的结果为Void
。这是Xcode正在显示的Void
(作为“(0 elements)
”,这是用户界面显示Void
的方式。)
相反,对于for循环,Xcode知道没有使用值的独立println
应该被解释为不是结果,而是将输出输出到标准,所以这是它做了什么。