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

Swift如何给get-only属性赋值?Movie结构体修改vote报错解决方案

问题原因

你当前代码中的vote是只读计算属性,仅实现了取值逻辑,没有定义赋值逻辑,因此无法直接对其赋值。同时DOUBAN_VOTES是不可变的let常量,即使给vote补充set方法也无法直接修改源数据的值。

解决方案

提供两种常用实现方案,可根据需求选择:

方案1:新增自定义投票存储属性(推荐)

该方案会保留JSON解码得到的原始DOUBAN_VOTES值不变,新增单独的存储属性保存手动修改的投票数,不会影响原始数据:

struct Movie:Codable,Identifiable{
    let id=UUID()
    let MOVIE_ID:String
    let NAME:String
    let ALIAS:String
    let ACTORS:String
    let COVER:String
    let DIRECTORS:String
    let DOUBAN_SCORE:String
    // 保留原始JSON解码的投票数字符串不变
    let DOUBAN_VOTES:String
    let GENRES:String
    let IMDB_ID:String
    let LANGUAGES:String
    let DIRECTOR_IDS:String
    // 注:原代码拼写为isFavered,和描述的isFavored不一致,可按需修正
    var isFavered:Bool = false
    // 新增私有存储属性,保存手动修改的投票数
    private var customVote: Int?

    var vote:Int{
        get {
            // 优先取手动修改的值,没有就用原始数据转换的结果
            if let custom = customVote {
                return custom
            } else if let v = Int(DOUBAN_VOTES){
                return v
            }else{
                return 0
            }
        }
        set {
            // 赋值时保存到自定义存储属性
            customVote = newValue
        }
    }
    enum CodingKeys: String, CodingKey {
        case MOVIE_ID, NAME,ALIAS,ACTORS,COVER,DIRECTORS,DOUBAN_SCORE
        case DOUBAN_VOTES,GENRES,IMDB_ID,LANGUAGES,MINS,OFFICIAL_SITE
        case REGIONS,RELEASE_DATE,SLUG,STORYLINE,TAGS,YEAR,ACTOR_IDS,DIRECTOR_IDS
    }
    // 结构体修改自身属性需要加mutating关键字
    mutating func upVote(newVote:Int){
        vote = newVote
    }
}

方案2:直接修改原始投票数字符串

如果你需要修改后同步更新DOUBAN_VOTES的值,可以把DOUBAN_VOTES改为可变属性,给vote补充set逻辑即可:

struct Movie:Codable,Identifiable{
    let id=UUID()
    let MOVIE_ID:String
    let NAME:String
    let ALIAS:String
    let ACTORS:String
    let COVER:String
    let DIRECTORS:String
    let DOUBAN_SCORE:String
    // 改为可变属性
    var DOUBAN_VOTES:String
    let GENRES:String
    let IMDB_ID:String
    let LANGUAGES:String
    let DIRECTOR_IDS:String
    var isFavered:Bool = false

    var vote:Int{
        get {
            if let v = Int(DOUBAN_VOTES){
                return v
            }else{
                return 0
            }
        }
        set {
            // 赋值时同步修改原始投票数字符串
            DOUBAN_VOTES = "\(newValue)"
        }
    }
    enum CodingKeys: String, CodingKey {
        case MOVIE_ID, NAME,ALIAS,ACTORS,COVER,DIRECTORS,DOUBAN_SCORE
        case DOUBAN_VOTES,GENRES,IMDB_ID,LANGUAGES,MINS,OFFICIAL_SITE
        case REGIONS,RELEASE_DATE,SLUG,STORYLINE,TAGS,YEAR,ACTOR_IDS,DIRECTOR_IDS
    }
    mutating func upVote(newVote:Int){
        vote = newVote
    }
}

内容的提问来源于stack exchange,提问作者Hannah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:06:03