컨텍스트 함수를 재정의 할 수 없습니다제네릭 매개 변수
나는 또한 아이 클래스의에 의해 오버라이드 (override)하는 클래스 선언에서 선언 일반적인 종류가 클래스 B를 A 급의 슈퍼 클래스입니다 클래스 A가 있습니다.
클래스 A에는 클래스 선언의 일부가 아닌 일반 매개 변수가 필요한 메서드가 있습니다.
클래스 B는 클래스 정의에서 제네릭 형식을 지정하여 클래스 정의를 재정의하고 제네릭 함수를 재정의하려고합니다.
예 :
문제class A<U: NSDictionary, Z: NSDictionary> : NSObject
{
func funcToOverride<T : JSONModel>()
{
}
}
class B : A<NSDictionary, NSDictionary>
{
override func funcToOverride<T:JSONModel>()
{
}
}
:
1 : 컴파일러 에러 메소드를 무시할 수 없다
클래스 B가
질문 "방법이 수퍼으로부터 임의의 방법을 대체하지 않는다") 왜 이것이 처음부터 발생합니까?
2)이 문제를 피하는 알려진 방법이 있습니까? 내 수퍼 클래스는 B 이외의 다른 하위 클래스에 대해서도 수퍼 클래스이므로 클래스 정의에 일반 매개 변수를 추가하면 단일 함수의 형식을 정의하는 데 문제가 있습니다.
추가 참고 사항 :
이 코드는 엄격히 적용됩니다. 기존의 큰 SDK 내부에서 작업하는 훨씬 복잡한 코드의 샘플. 필자는 현재 컨텍스트와 관련이없는 프로토콜이나 다른 클래스를 추가하지 않으므로 제네릭 충돌 문제를 해결해야합니다.
경우 누군가의 요청으로더 큰 컨텍스트에 대한 필요성을 느낀다
더 확장 된 샘플 버전 : 코드 있지만
class A<ResponseModel : NSDictionary, RedirectModel : NSDictionary>: NSObject {
let existingCompletionHandler : (responseModel : ResponseModel?, error : NSError?) -> Void = {
(responseModel : ResponseModel?, error : NSError?) -> Void in
}
func presentWebViewAndWaitForRedirect(redirectQueryPath : String)
{
let queryPathToDict : [NSObject : AnyObject] = [:]
treatRedirectWithResponseParams(queryPathToDict) {[weak self] (model, error) in
self?.callSomeRandomRequestWithRedirectModel(model)
}
}
func callSomeRandomRequestWithRedirectModel(redirectModel : RedirectModel?)
{
let requestResult : [NSObject : AnyObject] = [:]
treatRequestResponse(requestResult, completionHandler: existingCompletionHandler)
}
func treatRedirectWithResponseParams(responseParams : [NSObject : AnyObject], completionHandler : (model : RedirectModel?, error : NSError?) -> Void)
{
funcToOverride(responseParams, completionHandler: completionHandler)
}
func treatRequestResponse(someRequestResult : [NSObject : AnyObject], completionHandler : (model : ResponseModel?, error : NSError?) -> Void)
{
funcToOverride(someRequestResult, completionHandler: completionHandler)
}
func funcToOverride<T : NSDictionary>(params : [NSObject : AnyObject], completionHandler : (model : T?, error : NSError?) -> Void)
{
}
}
class B: A<NSDictionary, NSDictionary> {
//wants to provide something additional or different to the base implementation but still respect the base class logic flow
override func funcToOverride<T : NSDictionary>(params: [NSObject : AnyObject], completionHandler: (model: T?, error: NSError?) -> Void) {
}
}
class SomeOtherRandomClass : NSDictionary
{
}
class C: A<NSDictionary, NSDictionary> {
func someOtherClassCRequest()
{
let response : [NSObject : AnyObject] = [:]
funcToOverride(response) { (model : SomeOtherRandomClass?, error : NSError?) in
}
}
}
은 여기에 나타낸 바와 같이, 코드는 거의 의미가 있습니다. 귀하의 질문에 일부 정보가 없습니다.'JSONModel '이란 무엇입니까? 'JSONModel'을 따르거나 상속 한 다른 유형은 무엇입니까? 'T'의 목적은 무엇입니까? 함수 매개 변수로 전달되지 않으므로 어떻게 사용됩니까? –
샘플에서는 문제를 보여줍니다. 샘플의 논리를 따르는 경우 원하는 모든 클래스를 바꿀 수 있습니다. 어딘가에 "유형"이 T를이 일반 함수를 호출하는 다른 함수에 의해 결정됩니다. 또한 T는 호출 수신 기능에 따라 "변환"되는 약 3 가지 유형이 있기 때문에 일반적입니다. 어쨌든이 함수를 호출하는 JSONModel 또는 다른 함수를 상속하는 다른 유형은 명시된 문제와 관련이 없습니다. – Fawkes