"无法将不可变值传递给变异运算符:' i'是一个“让...”恒定"指导

时间:2018-03-26 07:23:52

标签: swift struct

为什么增加i值的函数会给我一个错误:

  

无法将不可变值传递给变异运算符:' i'是一个“让...”   恒定

这是我的代码:

import UIKit 
/* initialising the struct to store values in array and change them 
with function*/
struct DayMenu {
/* declaring the variables of menu for breakfast, lunch and dinner*/
let breakfast = "egg"
let lunch = ["orange", "apple", "meat"]
let dinner = ["veggi", "juice", "pasta"]
/* creating a function which changes the value by increasing the index 
of the array by 1*/
func showMenu(_:String, _:String, _:String)->String {
    var i:Int=0
    for i in 0...dinner.count {
        for i in 0...lunch.count {
            return lunch[i]
            dinner[i]
            i++ 
/* increasing the index by 1*/
error Cannot pass immutable value to mutating operator: i is a 'let' 
constant*/
        }}}}
let dinnerForToday = DayMenu()
let whatToEat = dinnerForToday.showMenu 

2 个答案:

答案 0 :(得分:1)

使用while代替for 您无法更改i这是一个迭代器。

var i:Int = 0在您的代码中无用 Swift中没有使用i++。使用i += 1

对两个循环使用错误的i键。例如,使用ij

样品:

//external loop
        var i = 0
        while i < dinner.count {
            i += 1

            //your logic

            //internal loop
            var j = 0
            while j < lunch.count {
                j += 1

                //you logic
            }
        }

答案 1 :(得分:0)

抱歉,您的方法showMenu很乱。

您无法增加for循环的索引变量,这是错误消息所说的内容。
但关键是你必须增加for循环的索引变量,因为for循环会自动执行。

如果您需要使用不同的增量步骤,请使用stride

其他问题:

  • 在代码中,甚至在运行时都没有达到增量行,因为您将在退出方法时返回第一个午餐。

  • 外部重复循环无意义

  • 顺便说一下,没有参数标签的三个参数未使用。

  • 您的语法for i in 0...dinner.count可能会导致异常,例如,在一个数组中,一个项目的范围为0...1(2个索引),但只有一个项目。

  • 缺少方法末尾的返回值。

您的方法使用此语法编译

func showMenu() -> String {
    for i in stride(from: 0, to: dinner.count, by: 2) {
        for j in stride(from: 0, to: lunch.count, by: 2) {
            return lunch[j]
            // dinner[i]
        }
    }
    return ""
}

然而在实践中,该方法只是这样做:

func showMenu() -> String {
     return lunch[0]
}