使用标签按颜色匹配两个图像阵列

时间:2017-02-16 02:22:07

标签: ios swift swift3

我有两个UIImageView数组,我填充了18个块和圆圈

var myBlocks = [UIImageView]()
var myCircles = [UIImageView]()

所以在我以一种漂亮的方式将我的圆圈添加到屏幕后,然后我的块会超过它们,我调用一个函数来设置圆圈的标签和块匹配,如果颜色匹配的话。意思是如果块是亮红色,我想找到亮红色的圆圈,并将它们都标记为0,依此类推。我设置标签的下面这行是抛出错误:

  

不能使用'UIImageView'类型的索引下标'[UIImageView]'类型的值   

func setTags() {
    for x in myBlocks {
        for y in myCircles {
            if x.tintColor == y.tintColor {
                myBlocks[x].tag = y  //Error here
            }
        }
    }
}

有更简单的方法吗?之所以我在创建时没有标记这两个是因为圆圈是使用一个洗牌的数组创建的,因为当游戏加载时我不想要相同的彩色圆圈和相同的颜色块。

编辑:我将其更改为x.tag = y.tag,似乎更好。但是,当我点击我的一个方块时,我正在进行两次打印。

 let objectDragging = recognizer.view?.tag
 print(objectDragging)

 //and

 print("the tag of the object your touching is \(myBlocks[objectDragging!])")

我在使用过程中得到的日志是

Optional(13)
the tag of the object your touching is <UIImageView: 0x7f8d4ba103a0;
frame = (263 180; 100 100); opaque = NO; tintColor = 
UIExtendedSRGBColorSpace 0.8 0.3 0.3 1; tag = 11; gestureRecognizers = <NSArray: 0x60000005fec0>; layer = <CALayer: 0x600000220580>>

所以有人说这个块被标记为13,其中一个是11。当我打印出myBlocks [count] .tag时,它就是它所说的13,我只是不知道11中的11来自哪里myBlocks [objectDragging]语句。

编辑2:是因为(myBlocks [objectDragging!])引用了不同的块吗?

2 个答案:

答案 0 :(得分:0)

你有两个问题。首先,myBlocks[x]会引发错误,因为您要循环遍历元素,而不是索引。其次,x.tag = y会引发错误,因为属性tag is an Int并且您尝试分配UIImageView

for x in myBlocks {
   for y in myCircles {
      if x.tintColor == y.tintColor {
         x.tag = y.tag  //fix here
      }
   }
}

编辑:或者,如果你想循环索引:

for x in 0..<myBlocks.count {
   for y in 0..<myCircles.count {
      if myBlocks[x].tintColor == myCircles[y].tintColor {
         myBlocks[x].tag = myCircles[y].tag
      }
   }
}

最后,如果你想要索引和元素,你可以这样做:

for (x, block) in myBlocks.enumerated() {
   for (y, circle) in myCircles.enumerated() {
      if block.tintColor == circle.tintColor {
         myBlocks[x].tag = myCircles[y].tag
      }
   }
}

答案 1 :(得分:-1)

这一行:

myBlocks[x].tag = y  //Error here

ymyCircles的元素。它不是tag

将该行更改为:

x.tag = y.tag