Перебирать доступные классы в расширении Swift? - PullRequest
0 голосов
/ 11 мая 2018

Что-то, чего я никогда раньше не пытался сделать, но у меня есть расширение, как показано ниже (для краткости), и я хотел бы иметь возможность рисовать каждый доступный цвет в коде.Я никогда не пробовал это раньше и не могу собрать правильные слова для поиска, чтобы даже приблизиться.Мысли?в рамках расширения.Я бы предпочел автоматизировать это, хотя.

extension UIColor {
    class func firstColor ( alpha: CGFloat = 1.0 ) -> UIColor {
        return  UIColor.init ( red: 139.0/255.0, green: 322.0/255.0, blue: 405.0/255.0, alpha: alpha )
    }

    class func secondColor ( alpha: CGFloat = 1.0 ) -> UIColor {
        return  UIColor.init ( red: 225.0/255.0, green: 139.0/255.0, blue: 127.0/255.0, alpha: alpha )
    }
}

1 Ответ

0 голосов
/ 11 мая 2018

Вот код, использующий методы выполнения Obj-C (обратите внимание на префиксы @objc, они необходимы для того, чтобы среда выполнения «видела» ваши методы):

import Foundation
import XCPlayground
import UIKit

extension UIColor {
    @objc class func fancyColorFirst ( alpha: CGFloat = 1.0 ) -> UIColor {
        return UIColor.red.withAlphaComponent(alpha)
    }

    @objc class func fancyColorSecond ( alpha: CGFloat = 1.0 ) -> UIColor {
        return UIColor.blue.withAlphaComponent(alpha)
    }
}

func methods(in c: AnyClass, where condition: (String) -> Bool ) -> [String] {
    var count: UInt32 = 0
    guard let foundMethods = class_copyMethodList(object_getClass(c), &count) else { return [] }

    let totalMethods = Int(count)
    var matches = [String]()

    for index in 0..<totalMethods {
        let method: Method = foundMethods[index]
        let selector: Selector = method_getName(method)
        let methodName = String(_sel:selector)
        if condition(methodName) {
            matches.append(methodName)
        }
    }
    return matches
}

print(methods(in: UIColor.self, where: { $0.hasPrefix("fancyColor")}))
...