2017-03-02 22 views
1

で定義された内部クラスの変数名を知る必要があります:あなたが理解したようは、私はこれらの2つのクラスを持っている外部クラス

class User:Obj 
{ 
    var firstBook:Book? 
    var secondBook:Book? 
} 

class Book:Obj 
{ 
    func getMyName() -> String 
    { 
     // Something need to do here 
     // return name 
    } 
} 

let user = User() 

let book_1 = Book() 
user.firstBook = book_1 

let book_2 = Book() 
user.secondBook = book_2 

print(book_2.getMyName()) //Expected: secondBook 
print(book_1.getMyName()) //Expected: firstBook 

は、私は、親クラスの変数名を取得する必要があります。あなたが名前としてBookクラスにプロパティを作成し、firstBookとsecondBookに名前プロパティを設定し、次のことが可能nameプロパティに

+1

なぜこれを正確に行う必要がありますか? – Hamish

+0

firstBookとsecondBookがローカルDB内の別のテーブルで、Bookオブジェクトから取得する必要があるとします。 –

答えて

2

を取得してそれを得ることができ、親class.Type

+0

それは解決策かもしれませんが、私はこのような変数を定義するときに自己を渡すことはできません: var firstBook = Book(self) –

+0

代わりにこれを行うことができます:var firstBook = Book(User.self)、 これと同じ結果が素晴らしいでしょう。 –

+1

私はあなたの使い方をより明確にするために私の答えを編集しました。 – dostu

1

を取得することも可能になる場合 は素晴らしいことだろう反射を使って同様のことを達成する。ブックオブジェクト内のユーザーオブジェクトについて知る必要があるので、親変数を追加しました。保持サイクルを避けるためには弱くする必要があります。

class User: Obj { 

    var firstBook: Book? { 
     didSet { 
      firstBook?.parent = self 
     } 
    } 

    var secondBook: Book? { 
     didSet { 
      secondBook?.parent = self 
     } 
    } 

} 

class Book: Obj { 

    weak var parent: Obj! 

    func getMyName() -> String { 
     let mirror = Mirror(reflecting: parent) 
     let variableName = mirror.children.filter { $0.value as? Book === self }.first?.label 
     return variableName! 
    } 

} 
+0

この方法ではありません。プロパティを設定しないでください。 –

関連する問題