在操场上没有地图功能的输出

时间:2015-04-21 18:35:46

标签: swift swift-playground

我有这些非常简单的代码行:

var friends = ["Mike", "Marika", "Andreas", "Peter", "Sabine"]

friends.map{
    println("Hallo \($0)!")
}

这在程序中工作正常,但我在操场上没有输出。 它只告诉我元素的数量和运行需要运行的次数。但它没有写出字符串。

是我还是Xcode中的错误?

enter image description here

1 个答案:

答案 0 :(得分:4)

这不是Xcode中的错误。虽然您的map代码将打印到标准输出(点击cmd-opt-enter以在右侧的助理编辑器中显示输出),但在风格上您应该避免使用map。使用for...in循环会更好:

for friend in friends {
    println("Hallo \(friend)")
}

如果您这次快速查看结果,您会看到更有帮助的结果:quicklook

(请注意,我已将快速查看切换到列表视图,其中显示了每个结果,而不仅仅是最后一个结果)

为什么这种方式有所不同?这是因为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应该被解释为不是结果,而是将输出输出到标准,所以这是它做了什么。