>我有以下实现:
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>
.
为什么以及如何使其返回正确类型的值?
更新
报告了一个错误。
您必须将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
。