Swift vs ObjC初始化过程?

在ObjectiveC中,我们创建了像

-(instancetype)init() { return [super init]; // Here it returns initialised value } Class *obj = [[Class alloc]init] 

但迅速的初始化者不会返回任何价值。

来自Swift文档

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

 init() { super.init() } let obj = Class() 

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

如何在swift中进行分配和初始化

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

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

  1. 运行时分配所请求类的实例
  2. 调用Initializer时将self设置为已分配的实例
  3. 初始化程序执行设置
  4. 运行时将初始化实例返回给客户端代码

虽然这种方法打破了一些有用的Objective-C模式,比如初始化器在出错时返回nil ,但实例化始终成功的保证允许编译器执行一些优化。 同样,如果没有让初始化者返回nil ,那么实际上不可能从语言中删除nil ,如果初始化者返回选项,那似乎很奇怪。

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

 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 } } } 

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

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

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