Невозможно преобразовать значение типа «XXX.Protocol» в ожидаемый тип аргумента «XXX.Type» - PullRequest
0 голосов
/ 04 июня 2019

У меня есть приложение, которое сохраняет свои данные в базе данных, и когда я полностью переписываю их в Swift, я сталкиваюсь со следующей проблемой. По сути, у меня есть корневой класс DatabaseObject, от которого наследуются все объекты в базе данных. Затем в какой-то момент я хочу объявить протокол, который будут принимать некоторые объекты базы данных. Наконец, я хотел бы иметь возможность использовать этот протокол в общих функциях, но он не будет компилироваться.

Вот упрощенный код, который вы можете запустить на детской площадке:

class DatabaseObject {
    var id: String

    init(id: String) {
        self.id = id
    }
}

protocol SomeProtocol: DatabaseObject {
    func someFunc()
}

func getObject<T: DatabaseObject>(id: String, type: T.Type) -> T? {
    // Fetch the object and returns it
    // [...]
    return nil
}

let object1 = getObject(id: "XXX", type: DatabaseObject.self)
let object2 = getObject(id: "XXX", type: SomeProtocol.self)

Последняя строка генерирует ошибку "Невозможно преобразовать значение типа 'SomeProtocol.Protocol' в ожидаемый тип аргумента 'DatabaseObject.Type'" .

SomeProtocol наследуется от DatabaseObject, поэтому я ожидаю, что этот код будет работать.

В качестве обходного пути я могу сделать это:

let workaround = getObject(id: "XXX", type: DatabaseObject.self) as? SomeProtocol

но мне это не нравится, так как это отчасти побеждает цель создания универсальной функции ...

Это ограничение Свифта? У кого-нибудь есть идея получше?

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