gpt4 book ai didi

ios - 名称和便利初始值设定项

转载 作者:行者123 更新时间:2023-11-28 06:27:28 27 4
gpt4 key购买 nike

我有一个关于 swift 初始化器的问题。根据苹果的 Swift3.0

  1. 指定构造器必须从其直接父类(super class)中调用指定构造器。
  2. 便利构造器必须调用同一个类中的另一个构造器。
  3. 便利构造器最终必须调用指定构造器。

现在我有两个类 A 和 B(A 的子类)。 A 和 B 都有两个具有以下结构的指定初始化器

enter image description here

谁能建议 B 类的指定初始化器将如何调用 A 类的初始化器?

最佳答案

因为在 A 中有两个指定的初始值设定项,它们由于不同的签名而没有歧义,并且可以相互区分。这意味着您可以轻松地从子类 B 中调用 A 的适当指定 初始值设定项。例如,对于 A

class A {
var a: Int

// designated "#1"
init() {
a = 0
}

// designated "#2"
init(_ a: Int) {
self.a = a
}

// convenience initializer for A
convenience init(_ foo: String) {
print(foo)
self.init(42)
}
}

我们有,例如<​​/p>

class B: A {
let b: Int

// designated "sub#1"
override init() {
b = 42
super.init() // use A's designated #1
}

// designated "sub#2"
override init(_ a: Int) {
b = 24
super.init(a) // use A's designated #2
}

// non-overriding designated "#3"
init(b: Int) {
self.b = b
super.init() // use A's designated #1
}

// convenience initializer for B
convenience init(_ foo: String) {
print(foo)
self.init() // use B's designated #1
}
// you may only call designated initializers of the superclass
}

但是请注意,子类的初始化器只能调用其父类(super class)的指定初始化器the Language Guide - Initializers - Initializer Delegation for Class Types 中的规则 1 和 2 涵盖了这一点[强调我的]:

Initializer Delegation for Class Types

To simplify the relationships between designated and convenience initializers, Swift applies the following three rules for delegation calls between initializers:

Rule 1

A designated initializer must call a designated initializer from its immediate superclass.

Rule 2

A convenience initializer must call another initializer from the same class.

Rule 3

A convenience initializer must ultimately call a designated initializer.

所以你不能从 B 的便利构造器访问 A 的便利构造器,而 B 的指定构造器自然必须,根据上面的规则 1,只调用 A 的指定初始化程序。

关于ios - 名称和便利初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41441247/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com