首页 > 解决方案 > swift中带有派生类的便利初始化器

问题描述

我想使用扩展初始化器对传入参数进行转换。

我在 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)

标签: swiftinitializationderived-class

解决方案


好吧,这是我得到的最接近的——我想摆脱那些 .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)

推荐阅读