Создать синглтон в Swift 4 в классе, имеющем публичный init - PullRequest
0 голосов
/ 30 июня 2019

У меня есть открытый класс в другом коде, подобном этому -

public class Person {

   public required init() {}

}

Этот класс находится в платформе и не может быть изменен.

Теперь проблема в том, что мне сказали наследовать от этого класса и создать одноэлементный объект нового класса

public class Jon: Person {
    public static var shared: Jon = Jon()
    required init() {}
}

Но необходимая инициализация позволяет пользователям создавать несколько экземпляров класса Jon.

Кто-нибудь может подсказать, как это сделать в swift 4.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я нашел решение для достижения этой цели.Изучите мое решение, надеюсь, оно послужит вашей цели.

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()
0 голосов
/ 30 июня 2019

Одним из решений является использование Composition, а не Inheritance в качестве проектного решения. Поскольку объект 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 может быть сделан частным, а вычисляемые свойства добавлены в класс singleton

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"
...