【问题标题】:Var getter and setter confusionvar getter 和 setter 混淆
【发布时间】:2014-08-26 20:14:02
【问题描述】:

我正在快速开发一个项目。我知道 getter/setter/didSet 如何为变量工作,这不是我想要的。我的项目是一个 SpriteKit 游戏,我对应该做什么有点困惑。在objective-c中,我一直只是创建了我的SKSpriteNode的一个属性,然后使用getter方法实现来访问它。但是,这不能很快完成。这就是我感到困惑的地方。以下是我已经设置的方式。

我的主要问题是:在 swift 中工作时我是否应该只做这个“解决方法”

func planeNode() -> SKSpriteNode { // use instance var here }

或者我应该在变量的getter方法中这样做:

var plane: SKSpriteNode { get { // use separate SKSpriteNode here and just return }}

感谢任何帮助

【问题讨论】:

  • 您是说您更喜欢使用 myObj.planeNode() 而不是 myObj.plane 吗?因为如果您声明var plane : SKSSpriteNode,那么您将免费获得getter 作为myObj.plane。在 Swift 中,所有属性(存储的或计算的)都可以通过简单的点语法访问。如果你想要一个函数,你必须自己定义它。

标签: swift sprite-kit


【解决方案1】:

您可以创建一个由存储属性支持的计算属性 - 我在 C# 中经常使用这种模式:

private var _plane: SKSpriteNode
public var plane: SKSpriteNode { get { return _plane } set { _plane = newValue } }

但请注意,您只需使用一个存储属性即可达到同样的效果:

public var plane: SKSpriteNode

在 obj-c 中使用 @synthesize 语句(现在已过时,因为自动应用)也是如此。不同之处在于支持数据成员可用于类(通常具有以下划线前缀的属性名称),而在 swift 中该数据成员根本不可见。

附录 想知道我是否误解了您的问题。您是否正在寻找一种方法来创建其价值被计算出来的财产?如果是,则使用计算机属性:

public var plane: SKSpriteNode { get { return ... } }

【讨论】:

  • 好吧,我应该做类似 public var plane: { get { var _plane: SKSpriteNode = SKSpriteNode();返回_平面; }} ?或者我应该怎么做?
  • hmm 不,每次使用 getter 时都会创建一个新实例。我认为 public var plane = SKSpriteNode() 是您所需要的 - 如果您不重新分配平面,那么您可以使用 let 代替 var 使其不可变:public let plane = SKSpriteNode()
  • 啊,我明白了。我习惯于使用 getter 方法从 objc 解决我的问题,但我现在了解它是如何工作的
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2016-02-24
相关资源
最近更新 更多