为啥函数调用在 swiftui 中返回不可变值时出现错误?

Posted

技术标签:

【中文标题】为啥函数调用在 swiftui 中返回不可变值时出现错误?【英文标题】:Why am I getting error as function call returns immutable value in swiftui?为什么函数调用在 swiftui 中返回不可变值时出现错误? 【发布时间】:2021-02-17 08:40:24 【问题描述】:

我想在一些时间间隔之间播放专辑中的歌曲,我使用这段代码来实现这个概念。但我不知道为什么我会收到这个错误。请帮我解决它。

mysongsplayer.play()
            
let date = Date()
let calendar = Calendar.current
let now = calendar.component(.second, from: date)
let starting_song = Double(now) + mysongsplayer.duration + (myModel.delay * 60)
            
let stop_song = starting_song + (myModel.time * 60)
while (start_song > stop_song) 
  for item in 0..<(selected_songs).count 
    if (stop_song > starting_song) 
      DispatchQueue.main.asyncAfter(deadline: .now() + starting_song) 
        selected_songs[item].play()
        Int(starting_song) += item + myModel.gap
      
    
  

所以此时我收到此错误

Int(starting_song) += item + myModel.gap

变异运算符的左侧不可变:函数调用返回不可变值

【问题讨论】:

【参考方案1】:

问题 1: 那是因为当您在 swift 中键入强制转换值时,它会返回一个不可变值(只读)。所以语句Int(starting_song) 将返回一个只读值,因此您不能通过添加itemmyModel.gap 来更改它的值。

问题 2: 此外,您已将 starting_song 声明为 let,因此无论如何您都无法更改其值。

首先,将let starting_song 更改为var starting_song。 接下来将Int(starting_song) += item + myModel.gap 更改为 starting_song += Double(item + myModel.gap)

这将起作用,因为 1. 您将 itemgap 的总和转换为双精度,而 starting_song 已经是双精度(类型检查不会失败) 2. 类型转换的值(项目的总和和间隙)没有被修改。

【讨论】:

【参考方案2】:

我希望您需要将强制转换为 Int。

starting_song += Int(item + myModel.gap)

【讨论】:

以上是关于为啥函数调用在 swiftui 中返回不可变值时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?

Swiftui 无法分配给属性:'self' 是不可变的错误

为啥 main() 函数不返回浮点值?

SwiftUI 试图从列表中删除对象但无法在不可变值上使用变异成员:是一个“让”常量

Python__19--函数调用的参数传递与变量的作用域

为啥在按值返回时总是调用复制构造函数