使用 For 循环更改 Swift 中的图像属性

Using a For Loop to Change Image Properties in Swift

我创建了一组 IBOutlet,名称为 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 没有名为 "hidden." 的成员

感谢您的任何建议。

您的列表必须已初始化为 [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
}

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

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

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

@IBOutlet var cards: [UIView]!

像常规 @IBOutlet 一样连接它们,但为每张卡指定相同的出口集合“cards”。然后它们将被收集到代码中的数组中,因此要隐藏所有卡片,只需:

for card in cards {
    card.hidden = true
}