SWIFT 反映某个协议的所有实现

SWIFT reflect all implementations of a certain protocol

我想使用SWIFT反射来解析某个协议的所有实现。

我要解决的问题是我想测试某个协议的所有当前和未来实现。

SWIFT中的反映有限,但看了之后,我觉得应该是可以的。我在 SWIFT 中找到了以下关于反射的文章,但我无法将其映射到我的特定用例。

https://nshipster.com/mirror/ https://www.swiftbysundell.com/articles/reflection-in-swift/

如何解析和迭代特定协议的所有实现?

protocol Animal {
    var color: UIColor { get }
    var name: String { get }
}

class Cat: Animal {
    var color: UIColor = .red
    var name: String = "Joshua"
}

class Dog: Animal {
    var color: UIColor = .blue
    var name: String = "Anna"
}

class TestAnimals {
    func testAnimals() {
        let mirror = Mirror(reflecting: Animal.self)

        for child in mirror.children {
            print(child.value)
        }
    }
}

定义说:Reflection 是一种常见的编程语言功能,使我们能够在运行时动态地检查和使用类型的 成员 . Members 是 class/struct.

中的属性列表

因此,如果您想遍历确认 Animal 协议的所有类型,您需要将它们作为类型中的 成员,然后遍历它。

检查下面的代码-:

protocol Animal {

    var name: String { get }
}

class Cat: Animal {
    
    var name: String = "Joshua"
}

class Dog: Animal {
    var name: String = "Anna"
}

class TestAnimals {
    var cat:Cat
    var dog:Dog
    
    init(cat:Cat,dog:Dog) {
        self.cat = cat
        self.dog = dog
    }
    
    func testAnimals() {
        let mirror = Mirror(reflecting: self)
        
        for child in mirror.children {
            if let animal = child.value as? Animal {
                print(animal.name)
            }
        }
    }
}


var obj = TestAnimals(cat: Cat(), dog: Dog())
obj.testAnimals()

或者,您也可以执行如下操作,使 composition.This 允许您在运行时分配任何 Animal 类型。

    class TestAnimals {
        var myAnimal:Animal
        
        
        init(animal:Animal) {
            myAnimal = animal
        }
        
        func testAnimals() {
            let mirror = Mirror(reflecting: self)
            
            for child in mirror.children {
                if let animal = child.value as? Animal {
                    print(animal.name)
                }
            }
        }
    }
    
       let objects :[Animal] = [Cat(),Dog()]
       for myobj in objects{
       let obj = TestAnimals(animal: myobj)
       obj.testAnimals()