swift - 将非泛型 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
说“表达式的类型在没有更多上下文的情况下模棱两可”。
解决方案
您正在参数化Parent
而不是Type
,这是您实际更改的内容。你的意思是:
func callFunc<T>(parent: Parent<T>) { ... }
虽然您可以显式调用 out T: Type
,但这并不是真正必要的,因为 Parent 已经强制执行了。
推荐阅读
- android - Android 冲突依赖
- c# - 使用 SendGrid 的预定邮件
- python - Python:我需要帮助生成特定格式的数字列表
- python - 如何使用 python 将 excel 数据放入 SQL Microsoft 服务器数据库
- c# - 包含字符串的任何单词
- android - 领域 IllegalStateException:架构验证失败
- node.js - Mongoose:更新特定文档数组的元素
- python - 用于复制后面有数字 2 的单词的 python 代码是什么?
- node.js - 如何使用 cPanel 重启 NodeJS
- mongodb - CrudRepository 保存方法不做更新