2016-03-24 1 views
6

、私は@objcプロトコルオブジェクトのすべてのリストを取得することができますに準拠しています。オブジェクトに準拠するプロトコルを一覧表示するにはどうすればよいですか? Objective-Cのランタイムを使用して

let obj = NSObject() 

var pc: UInt32 = 0 
let plist = class_copyProtocolList(object_getClass(obj), &pc) 

print("\(obj.dynamicType) conforms to \(pc) protocols") 

for i in 0 ..< Int(pc) { 
    print(String(format: "Protocol #%d: %s", arguments: [i, protocol_getName(plist[i])])) 
} 

またはランタイムによってロードされたObjective-Cのプロトコルのすべて:

var allProtocolCount: UInt32 = 0 

let protocols = objc_copyProtocolList(&allProtocolCount) 

print("\(allProtocolCount) total protocols") 

for i in 0 ..< Int(allProtocolCount) { 
    print(String(format: "Protocol #%d: %s", arguments: [i, protocol_getName(protocols[i])])) 
} 

しかし、これらのリストのどちらも任意のスウィフトプロトコル:私はそれが0123を返すことを期待するとき

func == (lhs: MyClass, rhs: MyClass) -> Bool { 
    return lhs.value == rhs.value 
} 

class MyClass: Equatable, Hashable { 

    var value: Int 
    var hashValue: Int { 
     return value 
    } 

    init(value: Int) { 
     self.value = value 
    } 
} 

var count: UInt32 = 0; 

let strProtocols = class_copyProtocolList(MyClass.self, &count) // 0x0000000000000000 

strProtocolsは0であります(MyClassEquatableHashableに準拠しているため)。

オブジェクトが準拠しているプロトコルのリストを取得するために、ランタイムによって公開されているインターフェイスはありますか?

答えて

4

できません。 ObjCプロトコルではないスウィフトプロトコルは、コンパイル時にのみ存在し、オブジェクト自体に実際には存在しません(なぜなら、そのメソッドが変数の型に基づいて静的にディスパッチされる理由です)。

+0

私の無礼に申し訳ありませんが、この答えは言葉のサラダです。コンパイラは知っています。 – Charlesism

+2

要点は、コンパイラはランタイムが認識しないが、情報はコンパイルされたバイナリには取り込まれないため、特定のオブジェクトに情報を問い合わせることができないということです。私はリフレクションについての最近の動向に従っていないので、このうちのいくつかは過去18ヶ月で変化しているかもしれません。 –

+0

乾杯。あなたのコメントは良い答えになるでしょう:)私は、Swiftのコンパイル時のチェックに照らして意味をなさない "プロトコルの準拠のdbを維持しないで"あなたの元の答えを誤解しました。 – Charlesism

関連する問題