You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:06:03