32058


複数のクラスに同じ名前のプロパティがあり、  
そのプロパティを参照するクラスを作成したいと考えております。

言葉で表現しにくいので、以下にサンプルを記載させて頂きました。  
クラスa,bには同じ名前のプロパティpがあり、  
クラスmonitorはプロパティpを参照するクラスになります。  
このクラスmonitorにクラス名aかbを与えることで、  
プロパティpを参照させたいと考えております。  
クラスはa,b,c,d,...と増え(プロパティpは必ずあります)、  
動的にクラス名をmonitorに与えたいと考えております。

[code]

    class a {
        var p: String!
        init() {
            self.p = "class a"
        }
    }
    class b {
        var p: String!
        init() {
            self.p = "class b"
        }
    }
    
    // ここではクラスa専用になっているが、クラスbでも共通で利用したい
    class monitor {
        var i: a!
        init() {
            self.i = a()
            print(self.i.p)  // class a
        }
    }
    let i = monitor()  // クラスaかbを渡して、共通のpを参照させたい
    
[/code]

伝わりにくい内容ではございますが、どうかよろしくお願い致します。  
より便利な方法がありましたらご教授頂けると幸いです。


CC BY-SA 3.0
2017-01-22T13:25:48.700
32057
2017-01-22T18:44:28.790
2017-01-22T18:44:28.790
5519
20142
question
swift swift2 swift3
クラス名を引数に与えて、与えられたクラス内の同じ名前のプロパティを参照させたい


直接の回答でなくて恐縮ですが、コメントに書いた「クラスオブジェクト(メタク‌​ラス)かインスタンスを渡せばいい」と言うのをコードにしておきます。できれば時間をとってご覧いただいた上で、本当にクラス名を文字列として渡す必要があるのかどうかを考えるための一助にしてください。

* * *

インスタンスを渡す

[code]

    import Foundation
    
    //
    //インスタンスを渡す
    //
    protocol MonitorTargetType {
        var monitoredProperty: String {get}
    }
    
    class TargetClassA: MonitorTargetType {
        var monitoredProperty: String
        init() {
            self.monitoredProperty = "class TargetClassA"
        }
    }
    class TargetClassB: MonitorTargetType {
        var monitoredProperty: String
        init() {
            self.monitoredProperty = "class TargetClassB"
        }
    }
    
    class Monitor {
        var target: MonitorTargetType
        init(target: MonitorTargetType) {
            self.target = target
            print(self.target.monitoredProperty) //->class TargetClassA
        }
    }
    let i = Monitor(target: TargetClassA())
    
[/code]

* * *

クラスオブジェクトを渡す

[code]

    import Foundation
    
    //
    //クラスオブジェクトを渡す
    //
    protocol MonitorTargetType {
        init()
    
        var monitoredProperty: String {get}
    }
    
    class TargetClassA: MonitorTargetType {
        var monitoredProperty: String
        required init() {
            self.monitoredProperty = "class TargetClassA"
        }
    }
    class TargetClassB: MonitorTargetType {
        var monitoredProperty: String
        required init() {
            self.monitoredProperty = "class TargetClassB"
        }
    }
    
    class Monitor {
        var target: MonitorTargetType
        init<T: MonitorTargetType>(targetType: T.Type) {
            self.target = targetType.init()
            print(self.target.monitoredProperty) //->class TargetClassB
        }
    }
    let i = Monitor(targetType: TargetClassB.self)
    
[/code]

文字列をクラスオブジェクトに変換したいのであれば、[別項](https://ja.stackoverflow.com/a/31712/13972)に述べたように辞書型を併用する手もあります。Swiftは強い型付けを行う言語ですので、できるだけ型安全なコーディングを心がけた方がSwiftのメリットを生かせるようなコードになるのですが。


CC BY-SA 3.0
2017-01-22T14:27:15.933
32058
2017-01-22T14:27:15.933
2017-04-13T12:52:39.113
-1
13972
32057
answer