Swift变量在使用前未初始化(但未使用)

前端之家收集整理的这篇文章主要介绍了Swift变量在使用前未初始化(但未使用)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前我有一些这样的快速代码
  1. class C {
  2. let type: Type;
  3. var num = 0;
  4. init() {
  5. self.type = Type({ (num: Int) -> Void in
  6. self.num = num;
  7. });
  8. }
  9. }

Swift编译器拒绝允许它,说我在初始化之前引用了self.type,即使这显然是完全不真实的.此外,我不能使用其他问题/答案中找到的解决方法,因为类型不是可选的,它是不可变的,所以它无法初始化为无意义的第一.

如何使Swift编译器接受这个完美有效的代码

这与早期从初始化器返回无关.回调是异步执行的 – 它被存储然后再被使用.

我还有几个进一步的让我们在这之后被初始化了.我必须将它们全部变成可变的可选项,即使它们不是可选的,也不能被突变.

这样做:
  1. class C {
  2. var type: Type?;
  3. var num = 0;
  4. init() {
  5. self.type = Type({ (num: Int) -> Void in
  6. self.num = num;
  7. });
  8. }
  9. }

我假设你知道.但你想知道你的版本为什么不工作.

现在为棘手的部分:为线

  1. self.num = num;

要工作,编译器必须将自己传递给内部的关闭.封闭可能并且可能在Type的构造函数内执行.

这就好像你写的那样

  1. self.type = Type({ (self: C,num: Int) -> Void in
  2. self.num = num
  3. });

这在语法上是错误的,但是解释了编译器编译代码所需要做的.

要将此必需的self实例传递给Type的构造函数,必须初始化self.但是自己没有初始化,因为你仍然在构造函数中.

当您尝试将self传递给Type的构造函数时,编译器会告诉您自己的哪部分未初始化.

附:

很明显,你的代码类型知道num.
如果你想使用let在C而不是var你可以做…

  1. class Type {
  2. let num: Int
  3. init () {
  4. num = 3
  5. }
  6. }
  7. class C {
  8. let type: Type;
  9. var num = 0;
  10. init() {
  11. self.type = Type();
  12. num = type.num
  13. }
  14. }

甚至

  1. class C {
  2. let type: Type;
  3. var num: Int {
  4. return type.num
  5. }
  6. init() {
  7. self.type = Type();
  8. }
  9. }

取决于您是否要更改num.这两个例子都没有错误地编译.

猜你在找的Swift相关文章