在初始化程序中调用函数:Swift

Calling function in initializer : Swift

我想在初始化器中调用一个函数,但我做不到

class someclass {

    var a : Int
    var b : Int

    init() {

        self.a = 5
        self.b = 4

        func printx () {
            println("you called the function")

        }
        printx()
    }
}

var ab = someclass()

是否可以做类似 ab.init().printx 的事情 和 当我用 someclass()

初始化时,这个 printx() 函数会执行吗

也许你会做这样的事情?

class someclass {

    var a : Int
    var b : Int

    func printx () {
        println("you called the function")

    }

    init() {

        self.a = 5
        self.b = 4

        printx()
    }
}

var ab = someclass()
ab.printx()

考虑一下你从不调用 init() 编写它,而只是用 someClass()

对于您的问题:不 - 您不能从 init 外部引用您的 printx 是的 - 您的 printx 将在调用 init 时执行。在 Swift 1.2:

 20> class Bar { 
 21.     var ping : Int
 22.     init () { 
 23.         ping = 1
 24.         func bar () { println ("bar") } 
 25.         bar() 
 26.     } 
 27. } 
 28> Bar()
bar
$R4: Bar = {
  ping = 1
}

init 中定义您的 printx 是完全可行的,您应该要求它有效(并且确实有效)。在 Swift 中按词法包含函数定义非常重要。现在,如果语言允许函数名递归可见...

这个问题只是表明对范围缺乏理解。

函数 printx() 不是 class SomeClass 上的方法,而是在您定义的特定 init() 方法范围内的函数。

正如所写,当您调用 init() 方法时,printx() 将执行(并打印):

看到顶部右窗格中的框了吗?这向我们展示了 playground 的所有控制台输出,与我们 运行 否则显示的完全一样。

但是,我们现在不能调用 ab.printx(),因为正如我之前所说,printx() 不是 class SomeClass 的成员。如果我们想在 SomeClass 的实例上调用 printx(),我们必须将它定义为 class 的实例方法(如果我们仍然想在 init 中调用它,我们可以)。