初始化器中的调用函数: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可以访问您的私有属性和方法。或者你可以考虑用一个更详细的问题来解释另一个问题。我认为我在范围上没有一个理解的问题。另一方面是的,我没有检查控制台输出。我只看到左边的那幅画。谢谢你指出。