在具有公共初始化的类中,在Swift 4中创建单例

时间:2019-06-30 08:23:26

标签: ios swift singleton swift4 init

我正在使用这样的不同代码公开课程-

in

此类在框架中,无法修改。

现在的问题是,我被告知要从此类继承并创建新类的单例对象

public class Person {

   public required init() {}

}

但是必需的初始化是让用户创建Jon类的多个实例。

有人可以建议如何快速进行此操作吗?

2 个答案:

答案 0 :(得分:0)

一种解决方案是使用合成而不是继承作为设计解决方案。由于Person对象也应该是单例的,因此我们使其成为不可变的,并使用所需的init

在私有init方法中对其进行初始化
public class Jon {
    static let instance = Jon()
    private init() {
        person = Person()
    }

    public let person: Person
}

它可以像这样使用(例如带有name属性)

var jon = Jon.instance
jon.person.name = "John"

或可以将Person设为私有,并将计算的属性添加到单例类中

public class Jon {
    static let instance = Jon()
    private init() {
        person = Person()
    }

    private let person: Person

    var name: String? {
        get { return person.name }
        set { person.name = newValue}
    }
}

然后直接访问name属性

var jon = Jon.instance
jon.name = "John"

答案 1 :(得分:0)

我找到了解决方案。希望能对我的解决方案有所帮助。

public class ParentClass {

    public required init() {}

}




class SubClass: ParentClass {

    static let sharedInstance = SubClass(foo: "")

    @available(*, unavailable)
    required init() { }


    //You can change the init parameter as per your requirement
    private init(foo: String) {
        super.init()

        //Write your initialization code
    }
}

如果您不想将任何参数传递给init,则可以执行以下操作。

private init(_ foo: String? = nil) {
        super.init()

        //Write your initialization code
}

现在,您无需传递任何参数即可初始化对象

static let sharedInstance = SubClass()