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
相关产品推荐
相关产品推荐

