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であります(MyClass
がEquatable
とHashable
に準拠しているため)。
オブジェクトが準拠しているプロトコルのリストを取得するために、ランタイムによって公開されているインターフェイスはありますか?
私の無礼に申し訳ありませんが、この答えは言葉のサラダです。コンパイラは知っています。 – Charlesism
要点は、コンパイラはランタイムが認識しないが、情報はコンパイルされたバイナリには取り込まれないため、特定のオブジェクトに情報を問い合わせることができないということです。私はリフレクションについての最近の動向に従っていないので、このうちのいくつかは過去18ヶ月で変化しているかもしれません。 –
乾杯。あなたのコメントは良い答えになるでしょう:)私は、Swiftのコンパイル時のチェックに照らして意味をなさない "プロトコルの準拠のdbを維持しないで"あなたの元の答えを誤解しました。 – Charlesism