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

时间:2014-07-06 14:30:42

标签: function swift

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

import Cocoa

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

addValues(23.83, 87.12)

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

import Cocoa

addValues(23.83, 87.12)

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

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

我也可以在Swift中这样做吗? 我没有在文件中找到任何内容。

编辑:

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

function

1 个答案:

答案 0 :(得分:13)

我相信在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)")
        }
    }

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