#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)
}