如何在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
实例”哦,现在我们在同一页!您完全正确,让我更新答案,感谢您指出这一点!