2016-05-30 2 views
0

Есть ли API вызов Swift зеркало, которое может сказать мне, какие протоколы объект соответствует, то есть:Swift Mirror API - Какие протоколы объект соответствует

protocol ProtocolA {} 
protocol ProtocolB {} 
protocol ProtocolC {} 

class User : A, C {} 

Тогда, если я имел следующий код, он будет распечатать A & C

let u = User() 
let mirror = Mirror(reflecting: u) 
let protocols = mirror.whichProtocols() // Made up code 
print(protocols) //A & C 

ответ

1

Невозможно вообще в Swift. Быстрое отражение - очень ограниченное дело. Если вы готовы преодолеть свой класс в ObjC, вы можете использовать ObjC Runtime functions, чтобы получить то, что вы хотите:

@objc protocol ProtocolA {} 
@objc protocol ProtocolB {} 
@objc protocol ProtocolC {} 

class User : NSObject, ProtocolA, ProtocolC {} 

var count: UInt32 = 0 
let protocols = class_copyProtocolList(User.self, &count) 

for i in 0..<Int(count) { 
    let cname = protocol_getName(protocols[i]) 
    let name = String.fromCString(cname) 

    print(name) 
} 

Каждый ваш протокол должен начинаться с префикса @objc и ваш класс должен наследовать от NSObject.