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()
我想使用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()