无法赋值给属性:函数调用返回不可变值

时间:2016-05-09 10:53:51

标签: swift

考虑以下示例。

   private void ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        double selected = Convert.ToDouble(ComboBox1.SelectedItem);
        dataAdapter = new SqlDataAdapter(selectCommand, connectionString);
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
        DataTable table = new DataTable();        
        dataAdapter.Fill(table);

        foreach(DataRow row in table.Rows)
        {
            var price = Convert.ToDouble(row["price"]);
            var calculation = //do your calculation here with **price** and **selected** value above from combo box
            row["price"] = calculation.ToString();
        }

        datagridview.Source = table;

    }

如果我试图改变类struct AStruct{ var i = 0 } class AClass{ var i = 0 var a: A = A(i: 8) func aStruct() -> AStruct{ return a } } 实例的变量,它会成功编译。

AClass

但是如果我试图改变var ca = AClass() ca.a.i = 7 方法的返回值,编译尖叫

aStruct

有人可以解释一下。

3 个答案:

答案 0 :(得分:11)

这是编译器告诉你修改struct没用的方法。

以下是发生的情况:当您致电aStruct()时,A副本会传回给您。此副本是临时。您可以检查其字段,或将其分配给变量(在这种情况下,您可以访问您的修改)。如果编译器允许您对此临时结构进行修改,则无法访问它们。这就是编译器确定这是编程错误的原因。

答案 1 :(得分:4)

试试这个。

var aValue = ca.aStruct()
aValue.i = 9

解释

aStruct()实际上会返回原始结构a的副本。除非您为其分配var

,否则它将被隐含地视为常量

答案 2 :(得分:3)

尝试使用struct代替struct,因为它通过引用传递并保留在对象上,而{{1}}按值传递(创建副本)。< / p>

相关问题