Swift变量在使用前未初始化(但未使用)
目前我有一些这样的快速代码:
class C { let type: Type; var num = 0; init() { self.type = Type({ (num: Int) -> Void in self.num = num; }); } } Swift编译器拒绝允许它,说我在初始化之前引用了self.type,即使这显然是完全不真实的.此外,我不能使用其他问题/答案中找到的解决方法,因为类型不是可选的,它是不可变的,所以它无法初始化为无意义的第一. 如何使Swift编译器接受这个完美有效的代码? 这与早期从初始化器返回无关.回调是异步执行的 – 它被存储然后再被使用. 我还有几个进一步的让我们在这之后被初始化了.我必须将它们全部变成可变的可选项,即使它们不是可选的,也不能被突变.
这样做:
class C { var type: Type?; var num = 0; init() { self.type = Type({ (num: Int) -> Void in self.num = num; }); } } 我假设你知道.但你想知道你的版本为什么不工作. 现在为棘手的部分:为线 self.num = num; 要工作,编译器必须将自己传递给内部的关闭.封闭可能并且可能在Type的构造函数内执行. 这就好像你写的那样 self.type = Type({ (self: C,num: Int) -> Void in self.num = num }); 这在语法上是错误的,但是解释了编译器编译代码所需要做的. 要将此必需的self实例传递给Type的构造函数,必须初始化self.但是自己没有初始化,因为你仍然在构造函数中. 当您尝试将self传递给Type的构造函数时,编译器会告诉您自己的哪部分未初始化. 附: 很明显,你的代码类型知道num. class Type { let num: Int init () { num = 3 } } class C { let type: Type; var num = 0; init() { self.type = Type(); num = type.num } } 甚至 class C { let type: Type; var num: Int { return type.num } init() { self.type = Type(); } } 取决于您是否要更改num.这两个例子都没有错误地编译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |