【发布时间】:2015-04-21 18:35:45
【问题描述】:
我有这些非常简单的代码行:
var friends = ["Mike", "Marika", "Andreas", "Peter", "Sabine"]
friends.map{
println("Hallo \($0)!")
}
这在程序中运行良好,但在操场上没有输出。 它只告诉我元素的数量以及需要运行多少次。但它不写字符串。
是我还是 Xcode 中的错误?
【问题讨论】:
我有这些非常简单的代码行:
var friends = ["Mike", "Marika", "Andreas", "Peter", "Sabine"]
friends.map{
println("Hallo \($0)!")
}
这在程序中运行良好,但在操场上没有输出。 它只告诉我元素的数量以及需要运行多少次。但它不写字符串。
是我还是 Xcode 中的错误?
【问题讨论】:
这不是 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)”,这是 UI 显示 Void 的方式)。
相反,通过 for 循环,Xcode 知道不使用值的独立 println 不应该被解释为结果,而是作为输出到标准输出的内容,所以这就是它会的。
【讨论】: