无法在循环中切换Bool

时间:2015-07-25 11:44:30

标签: ios arrays swift

我正在使用UICollectionView和我的模型数据。 我准备了这个模型数据

struct Room {
        let type: String
        let position: String
        var hidden: Bool?

        static let typeA = "A"
        static let typeB = "B"
        static let typeC = "C"

        static let positionA = "A"
        static let positionB = "B"
        static let positionC = "C"

        static var rooms = [
            Room(type: typeA, position: positionA, hidden: false),
            Room(type: typeA, position: positionB, hidden: false),
            Room(type: typeA, position: positionC, hidden: false),
            Room(type: typeB, position: positionA, hidden: false),
            Room(type: typeB, position: positionB, hidden: false),
            Room(type: typeB, position: positionC, hidden: false),
            Room(type: typeC, position: positionA, hidden: false),
            Room(type: typeC, position: positionB, hidden: false),
            Room(type: typeC, position: positionC, hidden: false)
        ]
    }

用于UICollectionViewCells。我需要做的是切换hidden bool值,以便它可以使用此

过滤单元格

cellForItemAtIndexPath

    if Room.rooms[indexPath.row].hidden == true {
      cell.layer.opacity = 0.5
    }

并且这样做,我在Room struct

中有这个功能
  static func toggleHidden(whichOne: String) {
    if var roomType = rooms.type {
      if roomType.type == whichOne || roomType.position == whichOne {
        roomType.hidden = true
      }
    }
  }

但它引发了一个错误:

Cannot assign to 'hidden' in 'roomType'

我可以做这样的事情

  static func toggleHidden(whichOne: Int) {
    (rooms[whichOne].hidden == false) ? (rooms[whichOne].hidden = true) : (rooms[whichOne].hidden = false)
  }

但是,它需要按字符串过滤,以便可以一次切换多个项目。我正在做的是切换hidden bool所有具有whichOne字符串的项目。

这种方法首先不聪明吗?任何建议都会受到赞赏,提前谢谢。

3 个答案:

答案 0 :(得分:1)

roomType.hidden = true中,您试图将true / false分配给String类型的变量(typeA,typeB等是字符串)。

也许你的意思是room.hidden

将typeA的所有房间设置为隐藏:

var typeARooms = rooms.filter { $0.type == typeA }
for room in typeARooms { room.hidden = true }
collectionView.reloadData()  // not animated

答案 1 :(得分:1)

这与Mundi的答案非常相似,但您应该执行以下操作

    var typeARooms = Room.rooms.filter { $0.type == "A" }
    for var i = 0; i < typeARooms.count; i++ {
        var room = typeARooms[i]
        room.hidden = true
    }

For-in循环元素是只读的(让变量)。这就是为什么您需要明确使用var来修改结构的原因。

答案 2 :(得分:0)

我这样结束了:

  static func toggleHidden(whichOne: String) {
    for index in 0..<rooms.count {
      if rooms[index].type == whichOne || rooms[index].position == whichOne {
        !rooms[index].isHidden ? (rooms[index].isHidden = true) : (rooms[index].isHidden = false)
      }
    }
  }

希望我能缩短它但它才有效。这样,如果我执行self.collectionView?.reloadData(),CollectionView会按预期应用更改 这是基于您的建议,非常感谢。