代码之家  ›  专栏  ›  技术社区  ›  esbenr

SWIFT反映了特定协议的所有实现

  •  0
  • esbenr  · 技术社区  · 5 年前

    我想使用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)
            }
        }
    }
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Tushar Sharma    5 年前

    Reflection 是一种公共编程语言功能,它使我们能够检查并使用 成员 Members

    所以,如果您想迭代所有确认 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()
    

    动物

        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()