2016-04-22 9 views
2

効果的に、クラスに渡すことができるメタタイプ(例:Type.Type)を返すプロトコルを持っていて、必要なときにオブジェクトをキャストしたいそのメタタイプに私がそれをキャストする理由は、それがtableViewデキュー機能で使用され、割り当てられたタイプにキャストしたいからです。Swiftのメタタイプへの格納とキャスト

この要約版(以下の完全版)を検討してください。

let anyObject: AnyObject = anything() 

let aType = type.type() // aType here is A.Type 

if let newType = anyObject as? aType { 

    print(newType) 
} 

// error: 'aType' is not a type 

私はaType.init()を使って初期化することができるので、これは型ではないのはなぜ混乱していますか?

完全なサンプルコードは以下のとおりです(そして、プレイグラウンドで実行することはOKです)。

import UIKit 

protocol P { 

    func type() -> A.Type 
} 

class A { 

} 

class B: A { 

} 

class C: A { 

} 

struct BData: P { 

    func type() -> A.Type { 

     return B.self 
    } 
} 

struct Foo { 

    let type: P 

    init(p: P) { 

     self.type = p 
    } 

    func create() { 

     let anyObject: AnyObject = anything() 

     let typeType = type.type() 

     if let newType = anyObject as? typeType { 

      print(newType) 
     } 
    } 

    func anything() -> AnyObject { 

     return B() 
    } 
} 

let data = BData() 

let foo = Foo(p: data) 

遊び場の実行に失敗しました:MyPlayground.playground:43:44:エラー: 'typeType' とタイプ あれば聞かせてNEWTYPE = ANYOBJECTではないでしょうか?タイプタイプ{

答えて

3

Ahmm。非常に良い質問。数日前と同じ3時間の痛みがありました。

だから、

Swift's static typing means the type of a variable must be known at compile time.

、あなたは残念ながらコーディング方法(あるいは幸い:))許可されていません:最後に、私は、主要なアイデアであることを、this answerを発見しました。

+0

のAw: '( なぜ幸い、あなたは言うでしょう – chillok

+0

@cilkを、まあ、私は、あなたのために別の答えを持っている男:) http://stackoverflow.com/a/1517670/2463616 – pacification

+0

ええああ、?けっこうだ。私が安全でないことを望むまで、安全のために素晴らしい。あなたは別の解決策にアプローチしましたか? – chillok

関連する問題