Ios Swift与ObjC初始化过程?

Ios Swift与ObjC初始化过程?,ios,swift,Ios,Swift,在Objective中,我们创建如下对象 -(instancetype)init() { return [super init]; // Here it returns initialised value } Class *obj = [[Class alloc]init] 但是swift初始化器不会返回任何值 与Objective-C初始值设定项不同,Swift初始值设定项不返回值。它们的主要作用是确保类型的新实例在首次使用之前正确初始化 现在,swift初始化器如何将实

在Objective中,我们创建如下对象

 -(instancetype)init()
{
  return [super init]; // Here it returns initialised value
}  

Class *obj =   [[Class alloc]init] 
但是swift初始化器不会返回任何值

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

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


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

这只是一种惯例。Swift initialiser设置了一个有效实例,理论上不能返回有效实例以外的任何内容,因此显式返回没有意义

因此(在我看来)分配和初始化顺序如下所示:

  • 运行时分配请求类的实例
  • 调用初始值设定项时,
    self
    设置为已分配实例
  • 初始化器执行设置
  • 运行时将初始化的实例返回给客户端代码

  • 尽管这种方法打破了一些有用的Objective-C模式,比如初始化器在出错时返回
    nil
    ,但实例化总是成功的保证允许编译器执行一些优化。同样,如果不删除返回
    nil
    的初始值设定项,就不可能从语言中实际删除
    nil
    ,如果初始值设定项返回可选值,这看起来会很奇怪。

    正如@Nikolaykasysanov所说,对于初始值设定项的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
            }    
        }
    }
    
    类号小于5:Int{
    变量myNumber:Int
    init(i:Int){
    self.myNumber=i
    }
    类func createWithInt(i:Int)->numberlessthan 5{
    如果我<5{
    返回编号不超过5(i)
    }否则{
    归零
    }    
    }
    }
    
    初始化器不显式返回任何值,因为它不是由代码直接调用的(实际上它返回的值对用户来说是不透明的)

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


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

    苹果没有发布任何基本的Swift教程吗?我在文档中找不到。有一本关于iBooks的书,由苹果发布,并在WWDC会议和开发者网站上公布,解释了所有这些。“你应该读一下。”福格迈斯特:是的,我知道斯威夫特·伊布克。我已经读过了,但找不到关于对象分配和初始化过程的更多细节。然而,他们谈论的是初始化器。你能回答我的问题吗know@Anil你到底在问什么?如何创建对象?斯威夫特!=您对此有什么参考吗?没有任何直接的参考。swift语言指南将Java中的“构造函数”称为初始值设定项。这只是命名约定,但内部实现非常类似。这种Objective-C模式不仅有用,而且还引发了一些微妙的问题。它不见了,这是件好事,伊莫。现在,Swift引入了另一个问题:程序员需要了解,init方法中的失败应该会中止程序,最好使用assert。无法再将责任转移到呼叫站点;)从Objective-C导入Swift的初始值设定项实际上可以返回
    nil
    。由于Swift类可以对Objective-C类进行子类化,这意味着Swift初始值设定项也可以有效地返回
    nil
    (如果超类初始值设定项返回
    nil
    )。从Objective-C导入Swift的初始值设定项可以返回
    nil
    。由于Swift类可以将Objective-C类分为子类,这意味着Swift初始值设定项也可以有效地返回
    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
            }    
        }
    }