在 Swift 中使用 Objective-C 轻量级泛型类型会给出 AnyHashable for type 参数



>我有以下实现:

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

最新更新