Как я могу использовать тип (of: someVar) как правильный тип в Swift?
Как я могу использовать type(of: someVar)
как правильный тип в Swift?
Предположим, у меня есть некоторый общий протокол.
protocol Decryptable: Decodable {
var cipher: Cipher
}
protocol Requestable {
associatedtype T
var schema: T
}
protocol Service {
static func invoke<R: Requestable>(_ request: R) -> Void where R.T: Decodable {
// impl. #1
}
static func invoke<R: Requestable>(_ request: R) -> Void where R.T: Decryptable {
// impl. #2
}
}
struct Request<T>: Requestable {
var schema: T
}
Сервис может вызвать Запрос, Схема которого является Декодируемой или Дешифруемой.
Однако, поскольку Decryptable соответствует Decodable, в других местах у нас есть некоторое значение Decryptable, которое было преобразовано в Decodable, например:
let myDecodable = myDecryptable as Decodable
// later... in a class that doesn’t know about myDecryptable...
let myRequest = Request(schema: myDecodable)
Service.invoke(myRequest)
Теперь, когда здесь вызывается сервисный вызов, он направляется к первой реализации (#1). Т.е., поскольку запрос был создан с переданным значением "myDecodable", invoke перейдет к реализации #1 (как будто Request.T - только некоторый тип Decodable, а на самом деле он Decryptable, скрытый под капотом).
Действительно, если я установлю точки останова в XCode, среда выполнения четко знает, что Request.T является Decryptable типом в любой ситуации, даже после того, как он был отключен.
Таким образом, внутри реализации 1 я пробовал много вещей для маршрутизации вызова, где схема расшифровывается для реализации 2:
typealias ActualType: Decryptable = R.T
if let downcastedRequest = request as? Request<ActualType> {
invoke(downcastedRequest)
}
// FAILS to compile
let schemaType = type(of: request.schema)
if let downcastedRequest = Request<schemaType>(schema: request.schema as? schemaType) {
invoke(downcastedRequest)
}
// FAILS to compile
if let downcastedRequest = Request<type(of: request.schema)>(schema: request.schema as? type(of: request.schema)) {
invoke(downcastedRequest)
}
// FAILS to compile
Пожалуйста, помогите, спасибо. (Был ли я глуп, чтобы попытаться использовать протоколы со связанными типами? Почему я не могу использовать тип (of: schema), как если бы это был правильный тип здесь...?
1 ответ
Используйте == вместо:
<...>
where R.T == Decodable <...>
where R.T == Decryptable <...>