Swift - 检查Array <anyobject>是否包含UIColor

时间:2016-07-16 18:15:00

标签: arrays swift swift2 uicolor

我遇到了一个小问题,我在谷歌上搜索了几个小时,但无法找到解决方案。

我在数组中存储多种类型的值 - 通常是String和UIColor。在我的一个函数中,我需要检查另一个数组是否包含某些String或UIColor。如果它包含一个或另一个或两个对象,我永远不会知道它。下面我的方法总是只选取字符串,但永远不会找到UIColor,即使我100%确定它在那里。甚至&#34;打印&#34;显示颜色存在,但总是被忽略。

如何正确检查数组是否包含UIColor?

// roundItem comes from Array<AnyObject> and reads: UIDeviceRGBColorSpace 0.160784 0.501961 0.72549 1
let btnInfo: Array<AnyObject> = dict["btn\(key)"]!

if ((btnInfo as NSArray).containsObject(roundItem as AnyObject)) {

            correctAnswer += 1
        }

如果字符串匹配,上面的代码将增加计数,但如果颜色根据&#34;打印&#34;它不会增加,控制台打印:

btnInfo:[UIDeviceRGBColorSpace 0.160784 0.501961 0.72549 1]

roundItem:UIDeviceRGBColorSpace 0.160784 0.501961 0.72549 1

我尝试了另一个版本,但它崩溃了:

     for item in (btnInfo as NSArray) {

            if item is UIColor {

                print("is UIColor")

                if ((roundItem as! UIColor).isEqual( item as! UIColor)){
                    correctAnswer += 1
                }
            }
            else if  item is String{

                print("is String")

                if roundItem as! String == item as! String{
                    correctAnswer += 1
                }
            }
        }

控制台打印:

无法转换类型&#39; __ NSCFString&#39; (0x10fa332c8)到&#39; UIColor&#39; (0x11167a268)。

我尝试使用Equatable进行扩展,但它也与AnyObject一起崩溃。

如何比较存储的UIColors或如何将UIDeviceRGBColorSpace转换为其他格式?

3 个答案:

答案 0 :(得分:2)

给出像这样的数组

let list:[AnyObject] = ["Hello", UIColor.whiteColor(), 123, UIColor.redColor()]

包含

您可以检查list是否包含给定的颜色

let result = list.contains { ($0 as? UIColor) == UIColor.whiteColor() }

颜色

您可以提取颜色并将它们放入UIColor(s)

的数组中
let colors = list.flatMap { $0 as? UIColor }
  

[UIDeviceWhiteColorSpace 1 1,UIDeviceRGBColorSpace 1 0 0 1]

颜色索引

您还可以提取颜色索引并将它们放入Int(s)

的数组中
let colorIndexes = list.enumerate().filter { $0.element is UIColor }.map { $0.index }
  

[1,3]

不是颜色

最后,您还可以检索颜色的元素,并将它们放入AnyObject(s)

的数组中
let notColors = list.filter { !($0 is UIColor) }

感谢@dfri

  

[你好,123]

答案 1 :(得分:1)

看起来无法保证如果item UIColor roundItem也是UIColor,那么您可以查看

if item is UIColor && roundItem is UIColor { ...

答案 2 :(得分:0)

谢谢大家的努力,特别是@appzYourLife - 用于排序的干净整洁的解决方案。

我发现了什么问题。我把两个数组放在简单的测试中,事实证明,&#34; roundItem&#34;被投射为一个字符串,而不是UIColor,这就是为什么它每次被忽略为UIColor。我正在从NSUserDefaults中检索此数组,并且该错误消息来自指向的数据

无法转换类型&#39; __ NSCFString&#39; (0x10fa332c8)到&#39; UIColor&#39; (0x11167a268)

...因为它存储为String。所以我做了一些更改,并将字符中的颜色存储为UIColor和字符串键,我正在比较它现在可以工作了。如果我用两个存储UIColors的数组(不是来自NSUserDefaults)测试上面的代码,它运行良好,所以如果有人发现它有用,它仍然可以使用。

再次感谢

最佳, 甲