【问题标题】:convenience initializers with derived classes in swiftswift中带有派生类的便利初始化器
【发布时间】: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


【解决方案1】:

嗯,这是我得到的最接近的 - 我想摆脱那些 .0、.1 的东西,但是......等等。

func F1(_ a: Int, _ b: Int)
{
    print(a)
    print(b)
}

let F1P = (1,2)

// this doesn't work, what is the syntax for this?
// can't find how to apply a tuple to a function in swift,
// everywhere says it should "just work"
//F1(F1P)

F1(F1P.0, F1P.1) // lame


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(sx: String) {
        self.init(A.transform(sx))
    }

    public class func transform(_ x_: String) -> Int
    {
        return (Int(x_)!)
    }
}

extension B
{
    convenience init(sx: String, sy: String) {
        // I want to do this, but it doesn't work
        // self.init(B.transform(sx, sy));

        let p = B.transform(sx, sy)
        self.init(p.0, p.1); // lame
    }

    public class func transform(_ x_: String, _ y_: String) -> (Int, Int)
    {
        return (A.transform(x_), Int(y_)!)
    }
}

let a = A(0)
let b = B(1,2)
let ae = A(sx:"3")
let be = B(sx:"4", sy:"5")

print(a)
print(b)
print(ae)
print(be)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多