Swift: как избежать переписывания этого init () во всех наследуемых классах? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть этот класс и протокол в рамках:

public protocol P {}

open class C {
    public init(_ p: P.Type) {
        //super.init() etc
    }
}

А в проекте используется этот фреймворк:

enum E: P {
    // cases...
}

Меня беспокоит то, что для каждого класса, который наследует C, мне нужно определить одно и то же init() следующим образом:

final class C1: C {
    init() {
        super.init(E.self)
    }
}

final class C2: C {
    init() {
        super.init(E.self)
    }
}

// etc...

Есть ли способ объявить это значение по умолчанию init в моем проекте, например, использовать расширение таким образом:

extension C {
    // Declare the init(E.self) here somehow?
}

Таким образом, я бы просто позвонил C1(), C2() и т. Д. Без определения его в подклассе.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете создать протокол, который содержит init, расширить протокол и предоставить реализацию по умолчанию, а также назначить протокол C.

public protocol P {}

enum E: P {
}

protocol A {
    init(_ p: P.Type)
}

extension A {
    init(_ p: P.Type) {
        // Add a default implementation
        self.init(E.self)
    }
}

class C: A {
    // If you want to override, note you need to add `required`
    required init(_ p: P.Type) {
    }
}

class C1: C {
    // No need to init here
}

Или, если вам не нужен другой протокол, вам понадобится новый класс, который реализует init и подкласс C и ваши C1 и C2 наследуют этот новый класс. Это то, что обычно делается, когда люди создают BaseUIViewController и делают свои подклассы UIViewControllers этого:

public protocol P {}

enum E: P {
}

class C {
    init(_ p: P.Type) {
    }
}

class CBase: C {
    // Override and provide default implementation
    override init(_ p: P.Type) {
        super.init(E.self)
    }
}

class C1: CBase {
    // No need to init here
}

class C2: CBase {
    // No need to init here
}
0 голосов
/ 28 марта 2019

Объявите удобный инициализатор

extension C
{
    public convenience init()
    {
        self.init(E.self)
    }
}

let c1 = C1()
let c2 = C2()

Или вы можете поместить удобный инициализатор в основное определение C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...