2017-02-11 28 views
0

isはどうしてfalseにチェックされていますか?Swift:サブクラスで基底クラスとスーパークラスをチェックする方法

class Person : BaseClass { ... } 
class Parent : Person { ... } 
. 
. 
let parent = Parent() 
print("parent is BaseClass: \(parent.self is BaseClass)") 
// this prints 'parent is BaseClass: false' 

サブクラスの基本クラスまたはスーパークラスを確認するにはどうすればよいですか?特にオブジェクトがサブクラス化された深さがわからない場合

UPDATE: 私の間違い以下は真

print("parent is BaseClass: \(parent.self is BaseClass)") 
// this prints 'parent is BaseClass: true' 

である。しかしこの1つは遊び場で

class GenericClass<T: BaseClass> { } 
. 
let myGeneric = GenericClass<Parent>() 
print("myGeneric is GenericClass<BaseClass>: \(myGeneric.self is GenericClass<BaseClass>)") 
// this prints 'myGeneric is GenericClass<BaseClass>: false' 

ではありません、私は次の警告取得しています:

Playground.playground : 'GenericClass'から に関連しない 'GenericClass'タイプが常に失敗する

したがって、基本クラスとの一般的な関係を確認するにはどうすればよいですか?

+0

これはジェネリック医薬品の不適切な使用のように感じます。あなたが解決しようとしている問題は何ですか? –

+0

それは簡単です。私はGenericClass とそのすべてのサブクラスで何かをする必要があります。実行時に私は管理できるオブジェクトのクラスを知らない。だから私はそれが正しいものをすることができるようにするためにそれをチェックする必要があります。 Swiftは一般的な継承をチェックすることができないので、私には聞こえます。コンパイル時にも問題ありません。私は、 'is'演算子を拡張するアイデアをもたらします。 – Dareon

+0

'GenericClass 'のサブクラスを教えてもらえますか?あなたの事例には何もありません。 –

答えて

1

含まれているタイプをタイプアリアスとして公開する必要があります。ここに解決策があります。

protocol BaseClass { } 
class Person : BaseClass { } 
class Parent : Person { } 

class GenericClass<T: BaseClass> { 
    typealias Contained = T 
} 

let myGeneric = GenericClass<Parent>() 
print("myGeneric is GenericClass<BaseClass>: \(type(of: myGeneric).Contained() is BaseClass)") 
+0

これは、 'myGeneric'の型がコンパイル時にわかっているので、これはうまくいきます。ミラーリングされたオブジェクトの属性はどうですか?すべての属性を繰り返し処理する場合、コンパイル時の型は 'Any'ですが、' attr.value is BaseClass'のようなものはとにかく動作します。しかし、 'type(of:myGeneric).Contained()'は動作しません。なぜなら、コンパイル時にAnyにはもちろん 'Contained'のようなメンバーがないからです。コンパイル時に「本当の」型がまったくわからない場合は、実行時にジェネリック型をどのように確認できますか? – Dareon

+0

プロトコルの使い方に関する初心者が必要なようです。私は彼らにいくつかの研究をすることをお勧めします。 –

+0

オッケン私は私のポイントを明確にしていないと思う。私の謝罪。私はもう一度やり直します。私は、ミラーリングされたオブジェクトの属性を反復処理しています。すべての属性タイプは 'Any'として知られているコンパイル時にあります。それらのうちの1つは、 'GenericClass 'または 'GenericClass 'のような 'BaseClass'のサブクラスのいくつかです。私の 'BaseClass'はプロトコルではなく、基本クラスと呼ばれるものです。この状況では、 'Any'はそのようなことがないので、私はContained()コンストラクタを呼び出すことができません。私は期待どおりコンパイルエラーを取得しています。この場合、ジェネリックタイプをチェックする可能性はありますか? – Dareon

関連する問題