【发布时间】:2021-03-16 17:10:16
【问题描述】:
我在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 '表达式类型在没有更多上下文的情况下不明确'。
【问题讨论】:
标签: swift objective-c generics downcast upcasting