在Swift中使用Objective-C轻量级泛型类型为类型参数提供AnyHashable

时间:2017-03-25 17:00:44

标签: objective-c swift generics

我有以下实现:

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

1 个答案:

答案 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