这里的 print() 是做什么的? (打印调用另一个打印函数的函数)

What does the print() here do? (Printing a function that invokes another print func)

我是编程新手,尤其是 Swift 语言。 我正在尝试打印包含打印功能的字符串(我使用字符串插值)。

我不明白为什么我从这段代码中得到了一个奇怪的输出:

func newFunc() {
    print("I print a message")
}

print("Function said: \(newFunc())")

我得到以下输出:

I print a message
Function said: ()

函数调用的消息在“函数说:”字样之前执行。 我知道我可以使用函数内部的 return 来获得正确的输出或使用变量来存储此字符串,但我想了解为什么会得到上述结果。

提前致谢!

我认为查看 call stacks 会帮助您更好地理解这个概念。本质上,当您调用 main 方法(单独的 print 语句)时,main() 会被放置在堆栈中。当函数在堆栈上时,直到 运行 完成后才会弹出。由于您对 newFunc() 的调用发生在 main 完成之前,因此 newFunc 然后被放置在调用堆栈中 main 的顶部。 newFunc() 打印、完成并弹出。因此,main 做同样的事情。

如果问题是“为什么输出看起来不像Function said: I print a message?”,那么简单的解决方案就是将代码更改为以下

func newFunc() {
    return "I print a message"
}
    
print("Function said: \(newFunc())")

在这里您会看到 newFunc() 方法不打印任何内容,而是 returns 向其调用者 main() 打印一个值。

您将 newFunc() 视为 return 有用的结果(您可以将其插入 "Function said: \(here)"。但它 return 没有任何作用,在 Swift 中相当于 returning Void.

Void 是一种模拟 return 无的类型。它相当于空元组 ()。如果函数没有显式声明 return 类型(例如 newFunc()),那么它的行为 就像 它声明了 return 类型Void 个。任何时候执行一个 void-returning 函数到达它的主体的末尾,就好像末尾有一个隐式的 returnreturn ()。写得更明确,你的代码表现得像:

func newFunc() -> Void {
    print("I print a message")
    return ()
}

print("Function said: \(newFunc())")

从这里开始,希望您应该清楚为什么会得到您所看到的结果。

您可能想要做的是 newFunc() return 一个有用的值,并将其插入到您的字符串中。像这样:

func newFunc() -> String {
    return "I print a message" // Actually, no you don't, you return a message.
}

print("Function said: \(nenFunc())")