0
어떻게 스위프트의 적절한 유형으로 type(of: someVar)
을 사용할 수 있습니까?유형 (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
}
서비스 스키마 복호 또는 암호 해독하는 요청을 호출 할 수 있습니다 : 가정하자
나는 몇 가지 일반적인 프로토콜 - 요청이있다. 암호 해독은 복호을 준수하기 때문에
그러나, 다른 곳에서 우리는 같은 복호하는 업 캐스팅되었습니다 어떤 암호 해독 값이 :
let myDecodable = myDecryptable as Decodable
// later... in a class that doesn’t know about myDecryptable...
let myRequest = Request(schema: myDecodable)
Service.invoke(myRequest)
서비스 호출이 여기에 호출되는 지금
, 첫 번째 구현은 라우팅합니다 (#1). 즉, 요청이 upcasted 값 "myDecodable"로 생성 된 이후, (실제로는 암호 해독이 때 Request.T은 후드 아래, 일부 복호 형 것처럼) 구현 # 1로 이동합니다 호출합니다. 내가 엑스 코드에 중단 점을 설정하면
는 사실, 런타임 명확 Request.T도 이후 업 캐스팅했다, 모든 상황에서 암호 해독 타입 것을 알고있다.
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
도와주세요, 감사 :
그래서 구현 (1)의 내부, 나는 경로에 스키마가 구현 2 해독하는 전화를 여러 가지를 시도했다. ? (나는 바보 난의 (유형을 사용할 수없는 이유는 무엇 관련 종류의 프로토콜을 사용하려고 되었습니까? 그것이 적절한 유형이 여기에있는 것처럼 스키마) ..
귀하의 질문에 대답하지는 않지만 직렬화에 사용하기 위해 스위프트 4에 '복호화 가능'프로토콜이 있습니다. 제 생각에 '복호화 가능'은 암호화와 더 관련이 있습니다, 맞습니까? –