如何在swift中返回var

Ann*_*ara 2 function ios swift

我很困惑,因为我习惯于通过这样的函数来获取var:

class ViewController: UIViewController {

  var timerVal:Int = calcolo()

    func calcolo() -> Int {

        return 0;
           }

}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.问题是:在调用中缺少参数#1的参数.

mat*_*att 5

问题是这timerVal是一个实例属性,calcolo是一个实例方法。不能在实例属性的默认值中直接调用实例方法,因为在将默认值分配给实例方法的时候,还没有实例!实例正是您正在创建的实例。

如果您打算编写计算属性,则语法如下所示:

var timerVal:Int {
    return 0
}
Run Code Online (Sandbox Code Playgroud)

如果您打算编写一个计算默认值的属性,则语法如下所示:

var timerVal:Int = {
    return 0
}()
Run Code Online (Sandbox Code Playgroud)

或者您可以声明实例属性lazy,以便在初始化时实例确实存在。

或者您可以将 的声明calcolo向上移动到文件的顶层,在那里它不再是一个实例方法而是一个全局方法。现在您可以在初始化程序中调用它。

  • 这是非常正确的。第一个例子是一个计算属性(阅读 Apple 的文档)。计算属性没有存储;它是计算出来的。如果你为它写了一个 getter,你可以在语法上分配给它。但是您仍然没有将值存储在其中(尽管您的 setter 可以存储在其他地方)。第二个例子是一个普通的存储变量,我们只是通过计算来分配它的初始默认值。 (2认同)

Ant*_*nio 5

有两个问题:

  • 在调用实例方法初始化属性时,必须显式指定实例,即 self
  • 无法使用直接或间接引用的语句或表达式初始化实例属性self,因为self在初始化所有属性之前,该属性不可用

要解决此问题,您可以将属性声明为lazy- 它将在第一次访问时初始化,因此在实例初始化之后:

lazy var timerVal:Int = self.calcolo()
Run Code Online (Sandbox Code Playgroud)