SwiftUI中数组.append方法不生效无法添加元素,求协助解决
问题原因
@State属性包装器使用场景错误:@State仅适用于SwiftUI的View结构体内部存储局部状态,你自定义的DeckSetup是非View类型的普通结构体,@State在此处不会生效,对属性的修改只会作用于当前结构体的临时副本,改动不会持久留存。- 结构体值类型特性限制:未标记
mutating的结构体方法默认无法修改自身的存储属性,即便去掉@State,现有代码也无法正常修改数组内容。
修正方案
方案1:作为全局状态模型使用(适用于多页面共享牌组数据)
将DeckSetup改为遵循ObservableObject协议的类,用@Published修饰需要响应变化的属性,在View层通过@StateObject持有实例即可全局同步状态:
import Foundation import SwiftUI class DeckSetup: ObservableObject { @Published var deckOCards: [String] = ["e"] @Published public var yourhand: [String] = [] @Published public var dealerHand: [String] = [] func setupDeck() { // Club Cards for i in 2...10 { deckOCards += [String(i) + " of Clubs"] } deckOCards.insert("Ace of Clubs", at: 0) deckOCards.append( "King of Clubs") deckOCards.append("Queen of Clubs") deckOCards.append("Jack of Clubs") //Heart Cards for i in 2...10 { deckOCards.append(String(i) + " of Hearts") } deckOCards.append("Ace of Hearts") deckOCards.append("King of Hearts") deckOCards.append("Queen of Hearts") deckOCards.append("Jack of Hearts") print(deckOCards.joined()) } } // View层使用示例 struct GameView: View { @StateObject var deck = DeckSetup() var body: some View { Button("生成牌组") { deck.setupDeck() } } }
方案2:作为工具结构体使用(仅用于生成牌组不需要持久状态)
直接去掉属性包装器,给修改属性的方法加上mutating标记即可:
struct DeckSetup { var deckOCards: [String] = ["e"] public var yourhand: [String] = [] public var dealerHand: [String] = [] mutating func setupDeck() { // 原有逻辑保持不变 // Club Cards for i in 2...10 { deckOCards += [String(i) + " of Clubs"] } deckOCards.insert("Ace of Clubs", at: 0) deckOCards.append( "King of Clubs") deckOCards.append("Queen of Clubs") deckOCards.append("Jack of Clubs") //Heart Cards for i in 2...10 { deckOCards.append(String(i) + " of Hearts") } deckOCards.append("Ace of Hearts") deckOCards.append("King of Hearts") deckOCards.append("Queen of Hearts") deckOCards.append("Jack of Hearts") print(deckOCards.joined()) } }
内容的提问来源于stack exchange,提问作者Superbia
相关产品推荐
相关产品推荐

