无法赋值,Swift视为不可变

时间:2017-07-21 10:57:04

标签: swift

我有协议:

protocol CellLineDrawing : Any {
    var isShouldDrawBottomLine : Bool { get set  }
    var isShouldDrawUpperLine : Bool { get set }
}

然后我尝试将值设置为符合协议的对象:

var arrValues : [Any]!


func drawLinesIfNeeded () -> Void {

    guard arrValues!.count > 0 else {
        print("Empty array")
        return
    }

    guard arrValues!.first is CellLineDrawing else {
        print("Does not conform to cell line drawing protocol")
        return
    }

    var firstModel = arrValues.first
    var lastModel = arrValues.last

    (firstModel as! CellLineDrawing).isShouldDrawUpperLine = true //ERROR - Cannot assign to immutable expression of type 'Bool'




}

2 个答案:

答案 0 :(得分:2)

表达式public function getInformation($model) { $result = $model::with(['province', 'city']); if($model == 'App\Models\Business') { // my mistake //$result->with(['businessProvince', 'businessCity']); $result = $result->with(['businessProvince', 'businessCity']); } $result->get(); } 常量 并且你不能改变它的属性(除非它是一个实例 参考类型)。

除非我弄错了,否则你需要一个临时变量:

(firstModel as! CellLineDrawing)

答案 1 :(得分:1)

只有当firstModel是类的实例并且时,您的作业才有效.Swift知道它是类的实例。

如果您的firstModel始终是类的实例,那么您可以通过更改协议来使代码正常工作。

由于您的协议未标有class,因此Swift认为它可以应用于structclass。所以(firstModel as! CellLineDrawing)被视为不可变,因为如果该项是结构,那就是它。

class添加到您的协议中:

protocol CellLineDrawing : class, Any {
    var isShouldDrawBottomLine : Bool { get set  }
    var isShouldDrawUpperLine : Bool { get set }
}

你告诉Swift这个协议只能应用于对象实例。在这种情况下,该项目可以变异。

(firstModel as! CellLineDrawing).isShouldDrawUpperLine = true // this now works

如果您的firstModel可以是struct的实例,那么您必须制作该项目的可变副本,进行更改,然后将其复制回来。请参阅@MartinR's answer