gpt4 book ai didi

swift - 使用默认值参数覆盖函数时,如何保持默认值与父类(super class)相同?

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

例如,这是一个父类(super class):

class A {
public init(a: String = "aaaa") {
// this class is in a framework, and the subclass use that framework.
......
}
}

有没有办法编写一个子类并用参数 a 的相同默认值覆盖 init

父类(super class)在框架内。一个项目使用这个框架,想覆盖一个有默认参数值的函数,但是似乎没有办法在覆盖函数中获取父类的默认参数值。我可以在子类中编写另一个函数,比如检查参数是否为 nil,然后使用其默认值调用父类(super class),否则,将子类参数值传递给父类(super class)。但是我想找到一种方法来编写完全相同的函数名,这意味着要覆盖父类(super class)函数。

最佳答案

(这个答案是最新的 Swift 3)

将默认参数值放在便利初始化器中,覆盖此便利初始化器指向的指定初始化器

您可以让带有默认参数的公共(public)父类(super class)初始值设定项成为一个便利初始值设定项,一个将用作父类(super class)和子类的初始值设定项“接口(interface)”的初始值设定项。这个方便的初始值设定项反过来简单地调用 fileprivate designated 初始值设定项,这是您在子类中覆盖的初始值设定项。例如

public class A {
let a: String

/* public initializer */
public convenience init(a: String = "aaaa") {
self.init(b: a)
}

/* "back-end" fileprivate initializer: implement initializer
logic here, and override this initializer in subclasses */
fileprivate init(b: String) {
self.a = b
print("super:", b)
}
}

public class B: A {
let b: String

override fileprivate init(b: String) {
self.b = "sub_" + b
print("sub:", b)

super.init(b: b)
}
}

/* The following initializations all call the convenience initializer defined in A */
let a = A() // prints> super: aaaa
let b = B() // prints> sub: aaaa, super: aaaa
let c = B(a: "foo") // prints> sub: foo, super: foo

print(a.a) // aaaa
print(b.a) // aaaa
print(b.b) // sub_aaaa
print(c.a) // foo
print(c.b) // sub_foo

在这个简单的例子中,子类覆盖了它的父类(super class)的所有指定构造器(这里:一个指定构造器),这就是为什么它的父类(super class)的所有便利构造器(这里:一个)都可用的原因(由子类继承),如 Language Guide - Initialization - Class Inheritance and Initialization - Automatic Initializer Inheritance 中的规则 2 所述.

Rule 1

If your subclass doesn’t define any designated initializers, itautomatically inherits all of its superclass designated initializers.

Rule 2

If your subclass provides an implementation of all of its superclassdesignated initializers—either by inheriting them as per rule 1, or byproviding a custom implementation as part of its definition—then itautomatically inherits all of the superclass convenience initializers.

关于swift - 使用默认值参数覆盖函数时,如何保持默认值与父类(super class)相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813613/

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