首页 > 解决方案 > 如何为仅获取属性赋值

问题描述

正如电影结构如下所示,我想vote通过该upVote函数上传我的保管库,但错误发生为“无法分配给属性:'vote' 是一个 get-only 属性”。

除了voteand 'isFavored,其他属性都是从本地 JSON 文件中解码出来的。

我的结构


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
    let DOUBAN_VOTES:String
    let GENRES:String
    let IMDB_ID:String
    let LANGUAGES:String
    let DIRECTOR_IDS:String
\\my own property:
    var isFavered:Bool = false
\\init the vote
    var vote:Int{
        if let v = Int(DOUBAN_VOTES){
            return v
        }else{
            return 0
        }
        
    }
    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
    }
\\my uploade vote function
    func upVote(newVote:Int){
        vote = newVote \\ here occurs the error
    }
}

标签: iosswiftstruct

解决方案


你有两个问题。

首先,正如您所发现的,您无法修改vote,因为它是一个计算属性。它的值由其 getter 方法中的代码确定。赋值没有意义。

我猜您使用了计算属性,因为坦率地说,您的 JSON 源很糟糕。整数应该作为整数发送,而不是字符串。

假设您无法将 JSON 更改为更合理的内容,那么您只需要更新函数DOUBAN_VOTES中的基础属性。upVote您将需要制作DOUBAN_VOTES一个var,而不是一个let

这将揭示您的第二个问题;结构是不可变的。为了允许函数更改值,必须将其标记为mutating函数。


var DOUBAN_VOTES:String

mutating func upVote(newVote: Int) {
    self.DOUBAN_VOTES = "\(newVote)"
}

推荐阅读