首页 > 解决方案 > 如何在不创建新的空实例的情况下获取类的实例

问题描述

我有一个名为 MyClass 的课程。MyClass 正在使用 SceneKit,并且在 sceneDidLoad() 上正在向我的 sks 添加一个精灵,并附加了这个类:

class MyClass: SKScene{
   var s = SKSpriteNode(imageNamed: "myImage.png"); 

   override func sceneDidLoad() {
      s.name = "TheNamedInstanceWithMySprite"
      s.size = CGSize(width: 10, height: 10);
      self.addChild(s)
      print("is created!");
   }

   func DoSomething(){
      print(s.name);
   }

}

现在在我的界面控制器中,我想获得对“s”对象类的这个实例的引用。这将允许我直接调用 DoSomething 函数来更改特定的精灵...

一个问题 - 在我的界面控制器脚本中 - 当我声明我的变量时,它会创建它的一个新实例。有什么方法可以在不创建新实例的情况下声明:

//problem - creates a new empty instance of the class on declaration
var mySprite = MyClass()

@IBOutlet weak var spriteTapGestures: WKTapGestureRecognizer!

@IBAction func onSpriteTap(_ sender: Any) {
   mySprite.DoSomething()
}

在我的界面控制器中,我可以在清醒状态下找到并设置我的精灵/类的正确实例到我的全局变量

override func awake(withContext context: Any?) {
   if let foundVar = MySceneClass(fileNamed: "MyClass") {
      mySprite = foundVar
   }
}

在使用找到的类的分配调用 awake() 之后 - 我可以使用正确的控制台日志调用 DoSomething ...但令人讨厌的是,为了创建“mySprite”的全局变量,我需要用空初始化它MyClass() 依次调用'print("is created!");'

我是 swift 新手,但似乎必须有更好的方法。如何在我的接口控制器中创建一个全局变量而不创建它的空实例。如何直接将其分配给我现有的实例并将其作为我的接口控制器中的全局变量?

标签: swiftswift5.1

解决方案


我想到了!

var title: String?

https://useyourloaf.com/blog/swift-lazy-property-initialization/

基本上只需要将它声明为一个可选的 var 所以它以 nil 开头...允许我在不初始化它的情况下分配它的类型。


推荐阅读