ios - 如何为仅获取属性赋值
问题描述
正如电影结构如下所示,我想vote
通过该upVote
函数上传我的保管库,但错误发生为“无法分配给属性:'vote' 是一个 get-only 属性”。
除了vote
and '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
}
}
解决方案
你有两个问题。
首先,正如您所发现的,您无法修改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)"
}
推荐阅读
- angular - 如何为 Angular Flex 布局指令(fxHide、fxShow)编写单元测试?
- php - 使用 Slim 框架时,get 函数以纯文本形式输出,并带有错误消息“未找到页面”
- dialogflow-es - Dialogflow 让机器人更人性化
- c# - 使用 C# SDK 中的存储连接字符串通过 URI 访问 blob
- javascript - 通过 web-socket 处理 CORS 通信
- kotlin - 如何在 buildSrc 中使用 project() 而不是 const 字符串,使用 Kotlin 进行 Gradle 依赖管理
- ruby-on-rails - 使用 form_with 的嵌套表单未正确提交参数
- javascript - 使用消息传递接口在 Python 中实现多处理
- python - pandas - 用字符串对行求和会折叠我的数据框
- python - Smartsheet webhook 子范围