2017-03-25 13 views
1

ためAnyHashableを与える:スウィフトでのObjective-Cの軽量ジェネリック型を使用すると、私は次の実装持つ型パラメータ

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 

スウィフトコードから使用しようとすると

MySet<NSString>().keys 

代わりSet<NSString>を私に与えてくれSet<AnyHashable>Set<Date>

MySet<NSString>().keys2 

を与えます。

なぜ、正しい型の戻り値にするのですか?

UPDATE

bugを報告しました。

答えて

0

あなたがNSObjectサブクラスであるTを制限する必要があります。次に、インターフェイスが

open class MySet<T : NSObject> : NSObject { 
    open var keys: Set<Date>! { get } 
    open var keys2: Set<T>! { get } 
} 

としてスウィフトにインポートされ

@interface MySet<T: NSObject *> : NSObject 

@property (strong, atomic, readonly) NSSet<NSDate *> * keys; 
@property (strong, atomic, readonly) NSSet<T> * keys2; 

@end 

、それが期待どおりに動作:

let myset = MySet<NSString>().keys2 
print(type(of: myset)) // Optional<Set<NSString>> 

Objective-Cで宣言することで、プロパティを非オプションにすることができます。

@property (strong, atomic, readonly, nonnull) NSSet<T> * keys2; 

が、その後、もちろんMySet初期化子がkeys2に セットを作成して割り当てることがあります。

+0

NSObjectサブクラスに制限したくない場合はどうすればいいですか?私は例としてNSStringを使用しました。 – mixel

+0

@mixel:ほとんどのObjective-CクラスはNSObjectのサブクラスです(多分あなたが使っているもの)。制限は、NSProxy(Hashableに準拠していない)のようなものだけを除外します。 –

+0

私はSwiftコードでこのObj-Cクラスを、NSObjectのサブクラスではないカスタムクラスで使用したいと考えています。 – mixel

関連する問題