我有以下实现:
MySet.h :
@interface MySet<T> : NSObject
@property (strong, atomic, readonly) NSSet<NSDate *> * keys;
@property (strong, atomic, readonly) NSSet<T> * keys2;
@end
MySet.m :
@implementation MySet
@synthesize keys, keys2;
@end
当我尝试使用Swift代码时,
MySet<NSString>().keys
给了我Set<Date>
和
MySet<NSString>().keys2
给了我Set<AnyHashable>
代替Set<NSString>
。
为什么以及如何让它返回正确类型的值?
更新
报告了bug。
答案 0 :(得分:0)
您必须将T
限制为NSObject
子类:
@interface MySet<T: NSObject *> : NSObject
@property (strong, atomic, readonly) NSSet<NSDate *> * keys;
@property (strong, atomic, readonly) NSSet<T> * keys2;
@end
然后将界面导入到Swift中
open class MySet<T : NSObject> : NSObject {
open var keys: Set<Date>! { get }
open var keys2: Set<T>! { get }
}
它按预期工作:
let myset = MySet<NSString>().keys2
print(type(of: myset)) // Optional<Set<NSString>>
您可以通过在Objective-C中将其声明为
来使该属性成为非可选属性@property (strong, atomic, readonly, nonnull) NSSet<T> * keys2;
但当然MySet
初始化程序必须创建并分配
设置为keys2
。