我有协议:
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'
}
答案 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认为它可以应用于struct
或class
。所以(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。