【问题标题】:Using a For Loop to Change Image Properties in Swift在 Swift 中使用 For 循环更改图像属性
【发布时间】:2015-03-15 06:23:26
【问题描述】:

我创建了一组 IBOutlets,名称分别为 card0、card1 ... card10、card11。

我想把它们全部隐藏起来。我可以简单地使用这段代码:

card0.hidden = false
card1.hidden = false
card2.hidden = false
card3.hidden = false
card4.hidden = false
card5.hidden = false
card6.hidden = false
card7.hidden = false
card8.hidden = false
card9.hidden = false
card10.hidden = false
card11.hidden = false

虽然它可以工作,但我想创建一个 For 循环,它可以为我节省一些麻烦并使我的代码看起来更漂亮。据我所知,这是:

var cardName = [card0, card1, card2, card3, card4, card5, card6, card7, card8, card9, card10, card11]

for var i = 0; i<12; i++ {
cardName[i].hidden = false
}

我收到一个错误,即 AnyObject 没有名为“隐藏”的成员。

感谢您的任何建议。

【问题讨论】:

  • 嘿约翰,如果这个或任何答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: arrays swift for-loop


【解决方案1】:

您的列表必须已初始化为 [AnyObject] 而不是 [NSView](或您的 IBOutlets 指向的任何内容)。

您应该能够明确地说它应该是[NSView]

let cards: [NSView] = [ /* Cards */ ]

(注意这里应该使用let关键字,因为列表不会发生变化)

您也可以在循环中强制转换对象,但这会更麻烦:

for var i = 0; i<12; i++ {
    (cardName[i] as NSView).hidden = false
}

哦!你也可以在 Swift 中做这样的循环!

for card in cardName {
    card.hidden = false
}

【讨论】:

    【解决方案2】:

    如果您按住 alt 键单击您的 cardName 变量,您将看到它的类型为 [AnyObject!],而 AnyObject 没有属性 hidden。您需要指定插座的类型,以便构造的数组能够推断出正确的类型(并且编译器将识别该类型的 hidden 属性):

    @IBOutlet weak var card0: UIView!    // (or whatever specific UIView subclass it is)
    @IBOutlet weak var card1: UIView!
    // ...
    

    此外,看起来这些确实应该被声明为一个出口集合,而不是单独的出口。一个简单的出口集合指定了一个视图的数组,并将大大简化您的代码:

    @IBOutlet var cards: [UIView]!
    

    像普通的@IBOutlet 一样连接它们,但为每张卡指定相同的插座集合“cards”。然后它们将在代码中收集到一个数组中,因此要隐藏所有卡片很简单:

    for card in cards {
        card.hidden = true
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2021-11-13
      • 2021-08-15
      相关资源
      最近更新 更多