在类init()方法

时间:2015-08-11 14:13:11

标签: ios swift

我有以下类(这很简单,并且它本身存在的唯一原因而不是它的属性和方法在需要它们的地方被编码以便我可以将它子类化)并且它被证明是相当困难的

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 = response

我了解在启动后无法分配let值,但特别是在类init方法中,Swift documentation中记录了这一点。

由于我只是给初始化程序内部的object赋值,我如何更改代码以明确告诉编译器我用来设置它的函数只会在初始化程序中使用?或者我是否必须以某种方式欺骗编译器?或者我正在努力实现的目标是什么?

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

  1. 在线:func toCallUponCompletion (response: PFObject){"变量' self.object'在初始化之前使用
  2. 在线:findFirstObjectsInBackgroundFromLocalDataStoreIfPossible(queryPassed, toCallUponCompletion: toCallUponCompletion) - "使用' self'在方法调用' findFirstObjectsInBackgroundFromLocalDataStoreIfPossible'在所有存储的属性初始化之前"
  3. 在以下行中:(此行上只有}) - 从初始化程序返回而不初始化所有存储的属性
  4. 感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:1)

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

在您的init(queryPassed:toCallWhenLoadFinishes:)初始化工具中,您没有达到此要求 - 当它返回时,object变量未初始化,而且它的更多内容是非可选的,因此你保证它会有价值。考虑一下 - 当使用此初始化程序创建类的实例时会发生什么,然后您尝试在下一行访问其object变量?应该怎么办?它没有意义,所以你不允许这样做。

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