Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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中更改协议变量_Swift_Protocols - Fatal编程技术网

如何在Swift中更改协议变量

如何在Swift中更改协议变量,swift,protocols,Swift,Protocols,我有两个从同一协议实现的类 protocol MyProtocol{ } class MyFirstClass : MyProtocol{ var test : Int = 0 } class MySecondClass : MyProtocol{ var test : Int = 0 } 如何使函数在每次传递MyFirstClass或MySecondClass的对象时增加测试变量 像这样的 var a = MyFirstClass() var b = MySecondCla

我有两个从同一协议实现的类

protocol MyProtocol{

}
class MyFirstClass : MyProtocol{
    var test : Int = 0
}
class MySecondClass : MyProtocol{
    var test : Int = 0
}
如何使函数在每次传递MyFirstClass或MySecondClass的对象时增加测试变量

像这样的

var a = MyFirstClass()
var b = MySecondClass()

func inc(myObject : MyProtocol){
    myObject.test ++ // myObject has no member `test`
}

inc(a)
inc(a)
inc(b)
inc(a)

这是完整的Swift 3代码:

protocol MyProtocol: class {
   var test: Int { get set }
}

class MyFirstClass: MyProtocol {
    var test: Int = 0
}

class MySecondClass: MyProtocol {
    var test: Int = 0
}

func inc(_ obj: MyProtocol) {
    obj.test += 1
}

var a = MyFirstClass()
var b = MySecondClass()

inc(a)
print(a.test) // 1
inc(a)
print(a.test) // 2
inc(b)
print(b.test) // 1
inc(a)
print(a.test) // 3
重要提示:

我只使用MyProtocol
,因为这允许代码优化


如果您想将其应用于任何类型(不仅仅是类),您可以采用(您可以在下面的评论中阅读更多有关此的信息)

您可以向协议的
扩展添加具体函数。我想这就是你需要研究的,但我不确定我是否完全理解你的问题……仅仅因为
MyProtocol
没有类限制(
:class
),并不意味着
MyFirstClass
MySecondClass
的实例在传递到
inc(\u:)时会被复制
function–它们仍然具有引用语义(例如将函数编写为
func inc(obj:MyProtocol){var obj=obj;obj.test+=1}
在这种情况下仍然有效)。使
MyProtocol
类绑定将一致性类型限制为类,因此允许编译器将类型为
MyProtocol
的实例视为引用类型–因此允许您直接在函数中对
obj
上的成员进行变异。然而,我理解您的意思:您的示例
func inc(obj:MyProtocol){var obj=obj;obj.test+=1}
不会更改原始实例。据我所见,OP想要更改原始实例。您所说的约束协议是正确的,并且由于OP使用了两个类作为示例,所以我觉得回答我的方式没问题(如果您只在类上使用它,在性能方面对其进行约束也是有意义的)。我的示例将更改原始实例()上的
test
属性。我同意在这种情况下,将协议绑定到类确实是有意义的,我只是不同意您回答中的以下部分“否则,当您调用
inc(:)
函数时,您将传递一份
MyFirstClass
/
MySecondClass
实例”哦,现在我们在同一页!您完全正确,让我更新答案,感谢您指出这一点!