Отражение Swift 5 получает список свойств класса и вызывает их

#ios #swift #swift5

#iOS #swift #swift5

Вопрос:

У меня есть класс, который использует переменные, вычисляемые классом, к которым можно получить доступ как из objc-c, так и из swift. Я хотел бы протестировать все эти свойства, которые начинаются с «const».

У меня есть это:

 import UIKit

class MyClass: NSObject {
    @objc class var  constMethod1 : UIColor {
    print("Method1")
    return UIColor.red
  }

  @objc class var  constMethod2 : UIColor {
    print("Method2")
    return UIColor.green
  }
}

var methodCount: UInt32 = 0
let methodList = class_copyMethodList(MyClass.self, amp;methodCount)

for i in 0..<Int(methodCount){
   let unwrapped = methodList?[i]
    // call method only if it starts with "const"
    let crtMethodStr = NSStringFromSelector(method_getName(unwrapped!))
   print(crtMethodStr)
    
    if crtMethodStr.hasPrefix("const") {
        // call it
    }
}
  

Все, что я получаю, это «init» в возвращаемом массиве? в чем проблема? Я видел в другом потоке, что просто добавление «@objc» должно исправить это. Также как мне получить доступ к одной из этих переменных из перенастроенного массива?

Ответ №1:

Из документов:

Описывает методы экземпляра, реализованные классом.

constMethod1 и constMethod2 являются вычисляемыми свойствами класса, которые преобразуются в методы класса в Objective-C. Поэтому они не будут возвращены class_copyMethodList . Но не бойтесь, в документах также говорится:

Чтобы получить методы класса класса, используйте class_copyMethodList(object_getClass(cls), amp;count) .

Итак, вы можете сделать:

 let methodList = class_copyMethodList(object_getClass(MyClass.self), amp;methodCount)
  

Чтобы вызвать его, вы можете использовать perform :

 if crtMethodStr.hasPrefix("const") {
    let result = MyClass.perform(method_getName(unwrapped!))!.takeUnretainedValue()
    print(result)
}