Swift:{get}和{get set}之间的区别是,选择哪一个?

自从Apple在2015年WWDC推出面向协议的程序设计以来,可以在互联网上轻松找到很多关于面向协议的程序设计的优点以及如何在日常应用程序开发中使用它的文章。 但是,这些文章中的大多数都忽略了在适应面向协议的编程之前我们需要了解的最基本的知识之一–在声明协议的属性要求时,何时应使用{ get set }{ get }

考虑一下我们有一个符合该协议的协议和一个结构,如下面的代码片段所示。

现在,让我们尝试创建MyStruct的实例并将一些值设置为myVar1myVar2

不出所料,将value设置为myVar1时不会出现任何错误。 但是,即使我们使myVar2仅可获取,我们也能够将值设置为myVar2。 然后出现一个问题:“ { get set }{ get }什么区别?”

现在,让我们尝试将MyStruct实例MyStruct MyProtocol类型,并将value设置为myVar1myVar2

如您所见,现在尝试将值设置为myVar2时出现错误。 这是什么意思? 这意味着{ get set }{ get }实际上是在协议级别为我们提供了所需的封装。 当我们在面向协议的编程中使用多态时,这特别有用。

假设您有一个Flyable协议,其中AirplaneHelicopter类均符合该协议。 您还具有SpeedLimitUpdater类,将使用它来更新所有Flyable速度限制。

想象一下,有一天您决定添加一个Bird类,并使它也符合Flyable协议。

等一下……这里有些SpeedLimitUpdater ,这是否意味着我们现在可以使用SpeedLimitUpdater类来更新鸟速限制? 显然,这是不允许的,因为bird不是机器,并且您不能设置它的速度限制。

为了解决这个问题,让我们将Flyable协议的speedLimit只设置为speedLimit ,将Bird类的speedLimit为私有。 SpeedLimitUpdater类的逻辑也需要更新。

如果您有兴趣,可以在这里找到完整的示例代码。 (只需将其粘贴到Xcode游乐场)

从上面的示例中,我们可以看到,在没有充分理由的情况下使用{ get set }将使您的代码更容易出错。 对我们来说, { get }更安全,让符合类型决定属性应具有的访问级别。 这是经验法则

在声明协议的属性要求时,请始终使用{get},除非您非常确定要同时设置它和settable。


我希望本文可以帮助您消除在声明协议的属性要求时所遇到的困惑。

如果您喜欢,请不要犹豫点击share按钮或分享此文章。 如果您有任何意见或疑问,请将其放在下面的评论部分。

如果您以后想阅读更多类似的文章,请随时在MediumTwitter上关注我。

对于那些感兴趣的人,这是我的LinkedIn Github