我遇到了一个小问题,我在谷歌上搜索了几个小时,但无法找到解决方案。
我在数组中存储多种类型的值 - 通常是String和UIColor。在我的一个函数中,我需要检查另一个数组是否包含某些String或UIColor。如果它包含一个或另一个或两个对象,我永远不会知道它。下面我的方法总是只选取字符串,但永远不会找到UIColor,即使我100%确定它在那里。甚至"打印"显示颜色存在,但总是被忽略。
如何正确检查数组是否包含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转换为其他格式?
答案 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)测试上面的代码,它运行良好,所以如果有人发现它有用,它仍然可以使用。
再次感谢
最佳, 甲