У меня есть приложение, которое сохраняет свои данные в базе данных, и когда я полностью переписываю их в 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
но мне это не нравится, так как это отчасти побеждает цель создания универсальной функции ...
Это ограничение Свифта? У кого-нибудь есть идея получше?