【问题标题】:Initializing a variable inside a function inside the Class init() method在类 init() 方法内的函数内初始化变量
【发布时间】:2015-08-11 23:29:37
【问题描述】:

我有以下类(这很简单,它本身存在而不是在需要的地方对其属性和方法进行编码的唯一原因是这样我就可以对它进行子类化),事实证明它非常困难.

class ParseSubclass{

    let object: PFObject

    init (objectPassed: PFObject){
        object = objectPassed
    }

    init (queryPassed: PFQuery, toCallWhenLoadFinishes: () -> ()){
        func toCallUponCompletion (response: PFObject){
            object = response
            toCallWhenLoadFinishes()
        }
        findFirstObjectsInBackgroundFromLocalDataStoreIfPossible(queryPassed, toCallUponCompletion: toCallUponCompletion)
    }
}

错误,

无法分配给“self”中的“object”。

在以下行被抛出:object = response

我知道在初始化之后不可能分配给let 值,但特别是在类的init 方法中,它是允许的,如Swift documentation 中所述。

由于我只在初始化器内部将值赋予object,我将如何更改代码以明确告诉编译器我用来设置它的函数将仅在初始化器内部使用?还是我必须以某种方式欺骗编译器?或者我想要完成的事情是不可能的?

(注意:我尝试将object 声明为var,但它也引发了更多错误,包括:

  1. 在线:func toCallUponCompletion (response: PFObject){“变量‘self.object’在被初始化之前使用过
  2. 在线:findFirstObjectsInBackgroundFromLocalDataStoreIfPossible(queryPassed, toCallUponCompletion: toCallUponCompletion) - “在初始化所有存储属性之前,在方法调用‘findFirstObjectsInBackgroundFromLocalDataStoreIfPossible’中使用‘self’”
  3. 在下一行:(只有一个} 在这一行上)- 从初始化程序返回而不初始化所有存储的属性

提前感谢您的帮助。

【问题讨论】:

  • ParseSubclass 是另一个类的子类吗?
  • 没有。我想命名有点混乱,但是由于这个类不会直接使用而只是子类,所以我给它起了这个名字。
  • @user3650087 在这种情况下,ParseSuperclassParseBase 将是更合适的名称。

标签: ios swift


【解决方案1】:

您对变量初始化的规则有微妙的误解。并不是所有变量都必须在init 方法中初始化,而是在初始化程序返回时所有变量都必须被初始化。这是一个重要的区别,因为 Swift 中初始化器的作用是保证对象在使用之前总是完全初始化。这也是在初始化所有存储变量之前不能在方法调用中使用 self 的原因 - 该方法必须期望 self 被完全初始化。

在您的 init(queryPassed:toCallWhenLoadFinishes:) 初始化程序中,您不满足此要求 - 当它返回时,object 变量未初始化,而且它不是可选的,因此您保证它会有一个值。想一想——当你的类的实例使用这个初始化器创建,然后你尝试在下一行访问它的object 变量时会发生什么?应该发生什么?这没有意义,所以你不能这样做。

object 更改为var 并没有帮助,因为您仍然不满足在从init 返回之前初始化所有变量的要求。你有两个选择:要么给object一个默认的初始化值,然后在你的异步方法调用它的完成处理程序之后更新它,或者让它成为一个可选变量,在初始化之后允许为nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 2020-03-04
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2021-06-08
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多