gpt4 book ai didi

arrays - Swift:通过引用传递修改 UIButtons 数组

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:10 26 4
gpt4 key购买 nike

问题:无法将不可变值作为 inout 参数传递:“cardView”是一个“let”常量

我找到的解决方案 1(但有不良行为):当我跳过 inout 声明和“&”时,代码工作正常。但是 View 不会立即更新。

// Line 3: updateCardView(...) is producing the error   
private func updateViewFromModel() {
...
for (index, cardView) in cardsContainerView.cardViews.enumerated() {
updateCardView(game.handedOutCards[index], &cardView)
}
}

private func updateCardView (_ card: Card, _ cardView: inout CardView) {
cardView.layerState(cardView: &cardView)
cardView.layer.borderColor = #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1).cgColor
}


class CardsContainerView: UIView {
var cardViews = [CardView](){
didSet {
setNeedsLayout()
}
}

class CardView: UIButton {
func layerState(cardView: inout CardView) {
cardView.layer.cornerRadius = 3
cardView.layer.borderWidth = 2
}
}

解决方案 2 有效,但仅当 layerState() 为空时:

private func updateViewFromModel() {
...
for index in cardsContainerView.cardViews.indices {
updateCardView(game.handedOutCards[index], cardsContainerView.cardViews[index])
}
}

private func updateCardView (_ card: Card, _ cardView: CardView) {
cardView.layer.borderWidth = 2
cardView.layerState()
cardView.layer.borderColor = #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1).cgColor
}


class CardsContainerView: UIView {
var cardViews = [CardView](){
didSet {
setNeedsLayout()
}
}

class CardView: UIButton {
func layerState() {
// Setting a border within this function is not working as expected
// The borders of the cards are only shown after another touch event and only for old objects of cardViews
//self.layer.borderWidth = 2
}
}

预期结果:每个新按钮在创建和更新 View 后都应立即显示边框。边框参数应在 layerState() 中设置。

实际结果:layerState() 中设置 borderWidth 时,不会立即显示边框。然而,在另一个触摸事件之后,cardView 的现有实例具有预期的边框。

最佳答案

cardView 是一个 let 常量,因为它是由 for 循环创建的。您可以通过添加 var 关键字使其成为 var:

for (index, var cardView) in cardsContainerView.cardViews.enumerated() {
updateCardView(game.handedOutCards[index], &cardView)
}

但这有点乱,因为您仍在创建一个新变量,它是对数组中变量的引用,然后传递该变量。它之所以有效,是因为数组中的变量和新变量都是对您的卡片对象的引用,但是整个 inout 都是浪费,因为您只是在扔掉 cardView 副本在循环的下一次迭代中。

您可以将循环更改为:

for index in cardsContainerView.cardViews.indices {
updateCardView(game.handedOutCards[index], &cardsContainerView.cardViews[index])
}

在这里,您使用 index 直接从数组中查找和传递值,因此数组项将被更新。如果 cardView 是一个 struct 而不是 class,这甚至可以工作。

由于您使用的是,因此您可以在不使用inout 的情况下更新对象。


您应该使用 self 来更新对象,而不是使用 inout 来传递引用:

class CardView: UIButton {
func layerState() {
self.layer.cornerRadius = 3
self.layer.borderWidth = 2
}
}

关于arrays - Swift:通过引用传递修改 UIButtons 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com