与 Objective-C 不同,Swift 的初始化方法需要保证类型的所有属性都被初始化。所以初始化方法的调用顺序就很有讲究。在某个类的子类中,初始化方法里语句的顺序并不是随意的,我们需要保证在当前子类实例的成员初始化完成后才能调用父类的初始化方法:
class Cat { var name: String init() { name = "cat" } }class Tiger: Cat { let power: Int override init() { power = 10 super.init() name = "tiger" } }
1.设置子类自己需要初始化的参数,power = 10
2.调用父类的相应的初始化方法,super.init()
3.对父类中的需要改变的成员进行设定,name = "tiger"
其中第三步是根据具体情况决定的,如果我们在子类中不需要对父类的成员做出改变的话,就不存在第 3 步。而在这种情况下,Swift 会自动地对父类的对应 init 方法进行调用,也就是说,第 2 步的 super.init() 也是可以不用写的 (但是实际上还是调用的,只不过是为了简便 Swift 帮我们完成了)。这种情况下的初始化方法看起来就很简单:
class Cat { var name: String init() { name = "cat" } }class Tiger: Cat { let power: Int override init() { power = 10 // 虽然我们没有显式地对 super.init() 进行调用 // 不过由于这是初始化的最后了,Swift 替我们完成了 } }
问题内容: 我正在寻找类似于Objective-C的class方法的行为,因为该方法在类初始化时被调用一次,此后不再被调用。 一个简单的闭合将非常时尚!而且很显然,当我们在结构闭包中使用“ s”而不是“ s”时,这一切都将非常匹配! 问题答案: 如果您有一个Objective-C类,最简单的方法就是重写。但是,请确保您的类的 子 类也被覆盖,否则您的类的 子 类可能会被多次调用!如果需要,可以使用
我有一个Java Spring Boot应用程序,在我的Maven pom.xml中将Flyway配置为依赖项(我有一个父pom和一个项目pom...Flyway是在我的项目pom中定义的)。 application.properties中只有几个条目: 我可以运行一个maven任务来让Flyway运行来创建/更新我的数据库,然后针对该数据库运行我的应用程序,但是我很难通过运行我的应用程序(这在p
问题内容: 我有多个上下文文件。要求是:在其余的Bean中首先初始化一个特定的Bean(进行一些配置更改)。 有没有一种方法可以首先加载该bean? 一种选择是使用“取决于”属性。 但这将需要更新所有其他bean,因此这似乎不是最佳解决方案。 我们有更好的选择吗? 问题答案: 恕我直言,您应该等待它们修复https://jira.spring.io/browse/SPR-3948 一种可能的方法是
问题内容: 据我所知,有四种方法可以在Swift中声明字典: 似乎这四个选项产生相同的结果。 这些有什么区别? 问题答案: 您要做的只是注意到您可以: 使用显式变量类型,或者让Swift根据分配给它的值来推断变量的类型。 使用正式的指定通用泛型符号,或使用内置的“语法糖”来描述字典类型。 二乘二就是四。 实际上,实际上您已经省略了一些可能性。例如,你 可以 说 当然,在现实生活中,您不愿做 任何
问题内容: 我正在尝试发现初始化发生的顺序,或者更确切地说,为什么要按此顺序进行初始化的原因。给定代码: 输出: 但是,将的声明移动到初始化块之前会产生: 而且我完全不知道为什么会以这种顺序发生。此外,如果我在的声明中消除了关键字,则init块和构造函数均不会触发。谁能帮我这个忙吗? 问题答案: 我认为您只是缺少JLS的12.4.2节,其中包括: 接下来,以文本顺序执行类的类变量初始化器和静态初始
问题内容: 我是来自C 背景的Python新手。虽然我知道用我以前的C 知识来尝试找到匹配的概念并不是Pythonic,但我认为这个问题仍然是一个普遍的问题: 在C 中,由于C 无法确定哪个全局/静态变量将首先在编译单元中初始化,因此存在一个众所周知的全局/静态变量初始化顺序失败的问题,因此,全局/静态变量取决于不同编译中的另一个变量单元可能比其依赖项对应的对象早初始化,并且当依赖项开始使用依赖项