首页 > 解决方案 > 将非泛型 ObjC 类向上转换为 Swift 方法参数的父类

问题描述

我有一些Objective-C与此类似的类定义:

@interface Type: NSObject {
    
}
@end

@interface SubType1: Type {
    
}
@end

@interface SubType2: Type {
    
}
@end

@interface Parent <T: __kindof Type *> : NSObject
@property (nonatomic, strong) NSArray <T> *anArray;
@property (nonatomic, strong) T anObject;
@end

@interface SubParent1: Parent<SubType1 *> {
    
}
@end

@interface SubParent2: Parent<SubType2 *> {
    
}
@end

我正在尝试制作一个Swift可以采用任何子类的函数Parent。我尝试了以下方法:

func callFunc(parent: Parent<Type>) {
                
}
callFunc(parent: SubParent1())

我得到了错误:Cannot convert value of type 'Parent<SubType1> to expected argument type 'Parent<Type>'

也试过:

func callFunc<T>(parent: T) where T: Parent<Type>{

}
callFunc(parent: SubParent1())

我得到了错误Type of expression is ambiguous without more context

一般来说,我想要一个可以处理任何类型的子父类 ( SubParent1, SubParent2) 的方法,它具有父类类型 ( SubType1, SubType2) 的子类型,因为该方法只需要访问在Parent. 由于其他一些限制,切换Objective-C类不是一个可能的选项,所以我正在寻找一种解决方案,将类定义在Objective-C. 不确定是否可能,但如果可能的话,如果参数预期为Parent

稍后编辑:另外,我如何允许函数在 Swift 中返回任何子父类型,例如:

enum AnEnum {
    case subParent1(_ : SubParent1)
    case subParent2(_ : SubParent2)
    
    func subParent<T: Type>() -> Parent<T>? {
        switch self {
        case .subParent1(let sub1):
            return sub1
        case .subParent2(let sub2):
            return sub2
        }
    }
}

sub1编译器抱怨sub2说“表达式的类型在没有更多上下文的情况下模棱两可”。

标签: swiftobjective-cgenericsdowncastupcasting

解决方案


您正在参数化Parent而不是Type,这是您实际更改的内容。你的意思是:

func callFunc<T>(parent: Parent<T>) { ... }

虽然您可以显式调用 out T: Type,但这并不是真正必要的,因为 Parent 已经强制执行了。


推荐阅读