在定义之前在Swift中声明一个函数

Tal*_*ode 10 function swift

如果我在Swift游乐场中运行此代码,它可以正常工作.该函数在调用之前定义.

import Cocoa

func addValues(valueA:Double, valueB:Double)
{
    let result = valueB + valueB
    println("Result \(result)")
}

addValues(23.83, 87.12)
Run Code Online (Sandbox Code Playgroud)

如果我在定义之前尝试调用该函数,则会收到错误消息.并不意外,因为编译器仍然不知道该函数.(由于某种原因,它似乎仍然有效)

import Cocoa

addValues(23.83, 87.12)

func addValues(valueA:Double, valueB:Double)
{
    let result = valueB + valueB
    println("Result \(result)")
}
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,我能够仅在文件顶部声明函数头,并在代码末尾定义函数.所以我的样本的第二个版本也会起作用.

我也可以在Swift中这样做吗?我在文件中找不到任何东西.

编辑:

andyvn22写道,这只会发生在操场上,而不是在实际项目中,所以我试了一下.只是一个带有功能的简单命令行工具.我得到相同的错误,它将无法编译.如果我在函数定义后移动调用它可以正常工作.

功能

dcg*_*oss 14

我相信在Swift中你通常不能在声明函数之前调用它们,因为当时编译器知道它们.在Objective C中,这是不同的,因为在头中声明函数会在导入时将其作为指向函数定义的指针引入编译器.然后,当调用该函数时,编译器可以引用导入的指针,然后将其带到文件中的函数定义.
在Swift中,这是不同的,因为我们不需要在头文件中声明我们的属性 - 我们同时在一个文件中声明和定义.虽然更简单,但这会产生类似于您的问题,编译器在声明/定义之前不知道该函数.
在类中,规则被更改,因为我们可以调用这样的函数:

    class HypnosisViewController: UIViewController {

        override func viewDidLoad() {
            // Function call
            addValues(30.0, 40.0) 
        } 

        // Function declaration
        func addValues(valueA:Double, valueB:Double){
            let result = valueB + valueB
            println("Result \(result)")
        }
    }
Run Code Online (Sandbox Code Playgroud)

即使函数调用之后才声明该函数.我们可以这样做,因为当创建一个类的实例时,该类的所有实例变量和方法都被初始化为该对象.这意味着编译器已经初始化 - 因此识别 - addValues函数,因此它不会抱怨.
但是,当代码以线性方式执行时,例如在Playground中,我们没有这个初始化,所以由于之前声明的原因(编译器不知道函数),因此无法在声明之前调用函数.Playground在这种情况下的非典型行为对我来说有点模棱两可,因为它抱怨函数声明之前的函数调用,但它仍然显示调用右边的结果.我相信这是由于Playground编译代码的独特方式.
我很抱歉,因为我不知道在Swift中保留这个Objective C功能的技术,我知道这是你问题的一部分.但是我希望这能给你一些背景知道为什么会这样.

  • 我不敢相信 Swift 不能处理这个。似乎在 2017 年,我们应该能够引用稍后在同一文件中声明的函数。 (2认同)