Swift vs ObjC初始化过程?

时间:2014-07-21 05:57:55

标签: ios swift

在ObjectiveC中,我们创建了像

这样的对象
 -(instancetype)init()
{
  return [super init]; // Here it returns initialised value
}  

Class *obj =   [[Class alloc]init] 

但是swift初始化器不会返回任何值。

From Swift docs

  

与Objective-C初始值设定项不同,Swift初始值设定项不返回值。它们的主要作用是确保在第一次使用之前正确初始化类型的新实例。

init()
{
  super.init()
}  

let obj = Class()

现在swift初始化器如何将实例返回到变量obj

如何在swift中发生 分配和初始化

3 个答案:

答案 0 :(得分:2)

正如@NikolayKasyanov所说,对于init系列的初始化者,返回(self)是隐式的,你不能返回nil。但是,如果要初始化可以返回nil的可选项,请使用类函数。 EG:

class NumberLessThan5: Int {

    var myNumber: Int
    init (i: Int) {
        self.myNumber = i
    }
    class func createWithInt(i: Int) -> NumberLessThan5? {
        if i < 5 {
            return NumberLessThan5(i)
        } else {
            return nil
        }    
    }
}

答案 1 :(得分:1)

这只是一个惯例。 Swift初始化器设置一个有效的实例,理论上无法返回任何其他有效实例,因此明确返回没有意义。

所以(从我的角度来看)分配&amp;初始化序列如下所示:

  1. 运行时分配所请求类的实例
  2. 调用初始化程序,并将self设置为已分配的实例
  3. 初始化程序执行设置
  4. 运行时将初始化实例返回到客户端代码
  5. 虽然这种方法打破了一些有用的Objective-C模式,比如初始化者在出错时返回nil,但实例化总是成功的保证允许编译器执行一些优化。同样,如果没有删除返回nil的初始化工具,则无法从语言中删除nil,如果初始化程序返回选项,这似乎很奇怪。

答案 2 :(得分:1)

初始化者不要显式返回任何值,因为它不是由代码直接调用的(实际上它返回的是对用户不透明的值)。

初始化程序由运行时的内存分配和对象初始化代码调用,为特定类型(类型结构或类)创建新实例.Runtime使用编译器生成的变量类型数据来确定需要多少空间将对象实例存储在内存中。

在分配此空间后,将初始化程序称为初始化过程的内部部分,以初始化字段的内容。然后,当初始化程序退出时,运行时将返回新创建的实例。