Как я могу использовать тип (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 <...>
Другие вопросы по тегам