Протокол стирания типа Swift с необходимым методом init - PullRequest
0 голосов
/ 26 мая 2018

У меня есть протокол, который соответствует Equatable

protocol TestProtocol: Equatable {
    var id: Int {get}
}

func ==<T: TestProtocol>(lhs: T, rhs: T) -> Bool {
    return lhs.id == rhs.id
}

Чтобы иметь возможность хранить значение TestProtocol, мы должны использовать стирание типа.

class AnyTestProtocol<T: TestProtocol>: TestProtocol {
    var id: Int {
        return item.id
    }

    private let item: T

    init(_ testProtocol: T) {
        self.item = testProtocol
    }
}

И, в конце концов, мы можемиспользуйте его, как эта структура TestStruct: TestProtocol {let id: Int}

let a = TestStruct(id: 1)
let b = TestStruct(id: 1)

a == b /// true

// let a = TestStruct(id: 1)
// let b = TestStruct(id: 0)
// a == b /// false

И все в порядке.Но я хочу использовать TestProtocol с обязательным методом init, таким как init(id: Int).Как я могу реализовать AnyTestProtocol Если TestProtocol содержит требуемый метод init?

protocol TestProtocol: Equatable {
    var id: Int {get}

    /// Required init method for every protocol implementation
    init(id: Int)
}

func ==<T: TestProtocol>(lhs: T, rhs: T) -> Bool {
    return lhs.id == rhs.id
}

class AnyTestProtocol<T: TestProtocol>: TestProtocol {
    var id: Int {
        return item.id
    }

    private let item: T

    required init(id: Int) {
        ????????
    }

    init(_ testProtocol: T) {
        self.item = testProtocol
    }
}

1 Ответ

0 голосов
/ 26 мая 2018

Просто переведите требуемый init(id:) вызов на T:

class AnyTestProtocol<T: TestProtocol>: TestProtocol {

    // ...

    required init(id: Int) {
        self.item = T(id: id)
    }

    // ...
}
...