Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 协议:无法分配给';X';在';Y';迅速地_Swift_Protocols - Fatal编程技术网

Swift 协议:无法分配给';X';在';Y';迅速地

Swift 协议:无法分配给';X';在';Y';迅速地,swift,protocols,Swift,Protocols,我刚刚定义了一个非常简单的协议和一个使用泛型的类来处理这个协议 在标有错误的行中,您将得到错误:“无法分配给'aObj'中的'flag'。 protocol Flag { var flag: Bool {get set} } class TestFlag<T: Flag> { func toggle(aObj: T) { if aObj.flag { aObj.flag = false; // <---

我刚刚定义了一个非常简单的协议和一个使用泛型的类来处理这个协议

在标有错误的行中,您将得到错误:“无法分配给'aObj'中的'flag'。

 protocol Flag {
    var flag: Bool {get set}
 }


 class TestFlag<T: Flag>  {

    func toggle(aObj: T) {

        if aObj.flag {
            aObj.flag = false;  // <--- error
        } else {
            aObj.flag = true;   // <--- error
        }
    }
 }
协议标志{
var标志:Bool{get set}
}
类测试标志{
功能切换(aObj:T){
如果aObj.flag{
aObj.flag=false;//来自:

默认情况下,函数参数是常量。正在尝试更改 函数体中函数参数的值 导致编译时错误。这意味着您无法更改 参数的错误值

在这种情况下,您可以添加
inout
,以便在函数调用之外保持切换:

func toggle(inout aObj: T) {           
   if aObj.flag {
      aObj.flag = false;
   else {
      aObj.flag = true;
   }
}
你也可以这样做:

func toggle(var aObj: T) { 
}

但这可能达不到你想要的。马诺兹的回答是正确的,所以我接受了

然而,几天前有一个类似的答案,使用相同的解决方案,但使用另一个论证(现在似乎已删除)

争论的焦点是,compliler不知道协议是用于类、结构还是枚举。使用Swift,协议可以被应用于所有这些类型。但结构实例使用按值调用,而类实例(对象)则使用按引用调用

从我的角度来看,这个答案也是正确的,因为您可以使用第二种解决方案来解决问题:

@objc  
protocol Flag {
    var flag: Bool {get set} 
}
只需在协议上添加@obj属性。因此,您只能将此协议用于仅通过允许引用调用才能产生结果的类。因此编译器不再需要
inout
信息


但是我寻找了一个增加协议重用的解决方案,并使用now manojlds建议。

只要在操场上复制它来测试你也可以这样做……协议标志:类{…}我也有同样的问题,但在我的情况下,aObj是类的一个属性。我需要做
var aObj=self.aObj;aObj.Flag=true