【问题标题】:Return in function without return value in Swift在 Swift 中返回没有返回值的函数
【发布时间】:2019-12-17 15:39:34
【问题描述】:

我们来看看这个函数:

func nothing(){
    return
}

它不返回值,但我们可以编写return 语句 Swift 如何处理它? return 没有值返回 0 或任何值来处理这种情况,幕后会发生什么?

【问题讨论】:

  • 正如@zneak 所说,它只是意味着“将控制权返回给调用者”。 (但是,在 Swift 中,没有返回值的函数具有 Void 类型的隐式返回值。)
  • “return 语句出现在函数或方法定义的主体中,并导致程序执行返回到调用函数或方法。程序在函数或方法调用之后的点继续执行。”摘自:Apple Inc. “Swift 编程语言 (Swift 2.2)。”电子书。 itun.es/de/jEUH0.l
  • “当return语句后面没有表达式时,它只能用于从不返回值的函数或方法返回(即当函数的返回类型或方法是 Void 或 ())。”摘自:Apple Inc. “Swift 编程语言 (Swift 2.2)。”电子书。 itun.es/de/jEUH0.l
  • @dfri:我用swiftc -emit-assembly -O main.swift检查了@inline(never) func foo() { return () }生成的汇编代码。我不是汇编编程方面的专家,但据我所知,没有返回值放在堆栈或返回寄存器中。
  • @MartinR 我明白了,谢谢。有趣的是,空元组的sizeof0,而strideof1(虽然strideof 是严格正数,所以这可能没什么意义)。此外,我们可以创建例如存储的空元组数组(例如通过从函数调用返回来初始化),但这可能与非预期功能有关。由于类型() 只能保存一个唯一值(()),因此可能不需要解析任何从函数捕获的()-returns,因为编译器可以推断出这些捕获的(单个唯一)返回值在编译时。

标签: ios swift


【解决方案1】:

以下签名都返回空元组()(类型别名为Void)的实例

func implicitlyReturnEmptyTuple() { }

func explicitlyReturnEmptyTuple() {
    return ()
}

func explicitlyReturnEmptyTupleAlt() {
    return
}

在所有上述三个中,函数的返回类型,在函数签名中,都被省略了,在这种情况下,它被隐式设置为空元组类型,()。即,以下与上述三个类似

func implicitlyReturnEmptyTuple() -> () { }

func explicitlyReturnEmptyTuple() -> () {
    return ()
}

func explicitlyReturnEmptyTupleAlt() -> () {
    return
}

关于您在下面的评论(关于implicitlyReturnEmptyTuple() 的正文,我们没有明确返回());来自the Language Guide - Functions: Functions without return values

函数不需要定义返回类型。这是一个版本 的sayHello(_:) 函数,称为sayGoodbye(_:),它打印 它自己的String 值而不是返回它:

func sayGoodbye(personName: String) {
    print("Goodbye, \(personName)!")
}

...

注意

严格来说,sayGoodbye(_:) 函数仍然返回一个 value,即使没有定义返回值。函数没有 定义的返回类型返回Void 类型的特殊值。这是 只是一个空元组,实际上是一个零元素的元组,它可以 写成()

因此,我们可以只为()-return (Void-return) 函数省略return ...,在这种情况下将隐式返回() instance

【讨论】:

  • 这很有趣,我很好奇第一个案例func implicitlyReturnEmptyTuple() -> () { } 我们没有写return,它期望return ()return
  • 这就是我想了解的
  • @iOSGeek 很乐意为您提供帮助。另请参阅this Q&A,了解有关空元组实例的小讨论。
【解决方案2】:

在这种情况下,return 仅表示“离开函数”。

【讨论】:

  • 是的,我知道,但我想了解它是如何工作的,进一步解释 Swift 如何处理这种情况以及存在价值的情况
  • 我不确定我是否理解您的问题。在最低级别,编译器知道调用函数期望在哪里找到返回值(如果有的话),并构建您的函数以将其返回值写入那里。如果没有,则不会在该位置写入任何内容,调用者也不会尝试从中读取。
【解决方案3】:

函数是 Swift 中的第一类对象。 他们有一个类型

func nothing(){
    return
}

上述函数的实际表示是这样的

func nothing()->(){
        return
    }

在上面的代码中,函数的类型是一个空元组

“()”

如果将上述函数分配给某个变量,我们可以看到返回的元组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2017-06-25
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多