【发布时间】:2019-12-08 07:22:51
【问题描述】:
我想使用扩展初始化器对传入参数进行转换。
我在 swift 5.0 中找不到正确的语法来执行此操作。这可能吗?
我想避免扩展 B 转换所有传入参数(在本例中从字符串到整数),但以某种方式依赖扩展 A init。
import Foundation
class A
{
var x : Int
init (_ x_: Int)
{
x = x_;
}
}
class B : A
{
var y : Int
init (_ x_: Int, _ y_: Int)
{
y = y_
super.init(x_);
}
}
extension A
{
convenience init(_ x_: String) {
self.init(Int(x_)!);
}
}
extension B
{
convenience init(_ x_: String, _ y_: String) {
super.init(x_);
self.y = Int(y_)!;
}
}
let a = A(0)
let b = B(1,2)
let ae = A("3")
let be = B("4","5")
print(a)
print(b)
print(ae)
print(be)
【问题讨论】:
-
来自 Swift 书籍:“规则 2:便利构造器必须从同一个类中调用另一个构造器。” 和 “规则 3:便利构造器最终必须调用指定的初始化程序。”.
-
@rmaddy 是的。尽管如此,我仍在寻找一种可行的方法。就像我可以使用 c++ 参数包来解决这个问题(如果它们有扩展)。 (使用基类静态解析方法,带出参数,转发到相同类-ini)
-
扩展 B 中的便利 init 只能调用 B 类中的 init。就是这样(您目前拥有的 init)。
标签: swift initialization derived-class