2017-10-23 10 views
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 해독하는 전화를 여러 가지를 시도했다. ? (나는 바보 난의 (유형을 사용할 수없는 이유는 무엇 관련 종류의 프로토콜을 사용하려고 되었습니까? 그것이 적절한 유형이 여기에있는 것처럼 스키마) ..

+0

귀하의 질문에 대답하지는 않지만 직렬화에 사용하기 위해 스위프트 4에 '복호화 가능'프로토콜이 있습니다. 제 생각에 '복호화 가능'은 암호화와 더 관련이 있습니다, 맞습니까? –

답변

0

사용 == 대신 :

<...> 
where R.T == Decodable <...> 
where R.T == Decryptable <...>