Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift扩展中迭代可用类?_Ios_Swift_Class_Swift4_Extension Methods - Fatal编程技术网

Ios 在Swift扩展中迭代可用类?

Ios 在Swift扩展中迭代可用类?,ios,swift,class,swift4,extension-methods,Ios,Swift,Class,Swift4,Extension Methods,这是我以前从未尝试过做的事情,但我有一个扩展,如下所示(为简洁起见进行了裁剪),我希望能够在代码中绘制出每种可用的颜色。我以前从未尝试过这一点,甚至无法找到合适的搜索词来接近它。想法,指针 我想在这里获得let availableColors:[UIColor]=magicalfunction(以某种方式指向扩展名) 我想我必须创建自己的函数,并在扩展中找到的UIColor中手动ram。不过,我更愿意将其自动化 extension UIColor { class func firstCo

这是我以前从未尝试过做的事情,但我有一个扩展,如下所示(为简洁起见进行了裁剪),我希望能够在代码中绘制出每种可用的颜色。我以前从未尝试过这一点,甚至无法找到合适的搜索词来接近它。想法,指针

我想在这里获得
let availableColors:[UIColor]=magicalfunction(以某种方式指向扩展名)

我想我必须创建自己的函数,并在扩展中找到的UIColor中手动ram。不过,我更愿意将其自动化

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

下面是使用Obj-C运行时方法的代码(注意@objc前缀,它们是使运行时“查看”您的方法所必需的):

<代码>导入基础 导入运动场 导入UIKit 扩展UIColor{ @objc类func fancyColorFirst(alpha:CGFloat=1.0)->UIColor{ 返回UIColor.red.带alpha组件(alpha) } @objc类func fancyColorSecond(alpha:CGFloat=1.0)->UIColor{ 返回UIColor.blue.WithAlpha组件(alpha) } } func方法(在c:AnyClass中,其中条件:(String)->Bool)->[String]{ 变量计数:UInt32=0 guard let foundMethods=class_copyMethodList(对象_getClass(c),&count)else{return[]} 让totalMethods=Int(计数) 变量匹配=[String]()
对于0中的索引..这可能会有帮助,我已经看到了这一点,但它是基于实例的,这不是我所寻求的。例如,我寻求能够查询可用颜色以创建数组,然后从中向选择器提供数据。我将重新挖掘您的链接,以防我错过要点;)…但是,内部代码显然存在,因为它显示了在自动完成中启动。您可以使用Obj-C运行时或反射,使用
Mirror
,但在一般原则上,这将违反OOP。顺便说一下,与其使用带有
alpha
参数的函数,不如使用
let
常量作为颜色,然后只使用
UIColor.withAlphaComponent
。第二,你的颜色组件毫无意义。
322.0/255.0
无效,因为
1.0
是组件的最大值。感谢sultham。。很好的理解了这些数字,我只是从原始git编辑了一些,而不仅仅是复制其他人的作品。这是GitHub的git,可能对所有人都很有帮助让最终用户选择颜色,但产品的巨大尺寸阻止了我手动操作。我只是在做一个穷人的模糊处理;)(阿尔法问题是git的一部分,而不是我的设计).对于那些感兴趣的人,原文在。我正在评估EVReflection以完成我所寻求的。但更好的办法是使用协议来声明某种“合同”只需检查您的类/结构是否支持它。谢谢@Sergiy!我将测试此代码并返回结果,并相应地检查您的回复,干杯!drew。。
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")}))