初始化器中的调用函数:Swift

初始化器中的调用函数:Swift,swift,init,Swift,Init,我想在初始值设定项中调用函数,但我做不到 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 = somecl

我想在初始值设定项中调用函数,但我做不到

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,是的-当调用init时,您的printx将执行。在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不是类SomeClass上的方法,但它是定义的特定init方法中的函数范围

如前所述,printx将在调用init方法时执行并打印:

看到右窗格顶部的框了吗?这向我们展示了操场上所有的控制台输出,如果我们不这样做,它会显示出来


但是,我们现在不能调用ab.printx,因为正如我前面所述,printx不是SomeClass类的成员。如果我们想在某个类的实例上调用printx,那么我们必须将它定义为该类的实例方法,如果我们仍然想在init中调用它,我们可以。

你说不能这样做是什么意思?错误信息是什么?你不能从外部访问printx,但它应该在你创建一个新的someclass对象时执行。我的意思是,当我初始化为ab=someclass时,你调用的函数字符串(假定是打印的)并没有出现在playway.Odd中。我将您的代码放入一个示例项目中,运行它,并在调试控制台中打印字符串。使用REPL而不是游乐场来打印输出…@GoZoner您可以在游乐场中看到打印输出。但是如果您没有完成初始化的第一阶段,您将无法调用它。考虑init类似的情况:打印{//打印某物}然后是Soad。A=5,Bo.B.4。在设置A和B阶段之后,您可以完成,并且可以调用其他函数。在操场上试试看。如果您在设置b之前调用print,您将由于第一阶段未完成而收到编译器错误。这将非常奇怪,但您甚至可以将a和b阶段1设置为completed,调用printx,然后更改b。。。您将打印与实例不同步的内容,但您可以这样做。在调用print之前,您需要将实例置于完全定义的状态。实际上,问题是,我的实现中的这个函数将更改类中的某些属性。这个函数的一些参数是私有的,而这个函数又被认为是私有的。但我希望这个功能是公开的。考虑一些计算器应用程序,带有预定义的操作集。我希望用户能够实现和添加他的操作。如果它作为一个方法在类定义中,它将成为私有的。这就是为什么我要把它放在一个初始值设定项中。我不完全清楚你的最终意图。无论如何,认为PrPtX是公共功能是完全合法的。只有printx可以访问您的私有属性和方法。或者你可以考虑用一个更详细的问题来解释另一个问题。我认为我在范围上没有一个理解的问题。另一方面是的,我没有检查控制台输出。我只看到左边的那幅画。谢谢你指出。