如何在另一个类中访问扩展的var?

时间:2017-10-28 14:37:26

标签: swift variables sprite-kit appsettings

我正在使用Sprite Kit。我想用设置类更改主类的按钮图片。如何在主类的扩展名(来自设置类)中创建变量?

这是扩展名:

extension ChangingDots {
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    for touch in touches{

        let locationUser = touch.location(in: self)

        if atPoint(locationUser) == DCButton {

     var blackdot = SKSpriteNode(imageNamed: "AppIcon") //<--var I want to use


        }
    }


}
}

以下是主要类中的用法:

    blackdot.setScale(0.65)
    blackdot.position = CGPoint(x: CGFloat(randomX), y: CGFloat(randomY))
    blackdot.zPosition = 1
    self.addChild(blackdot)

有没有人有更好的想法改变一个班级的按钮图片?

3 个答案:

答案 0 :(得分:1)

如果要在主类中使用变量,则需要在主类中创建它。扩展旨在扩展功能,这意味着功能和计算属性。

要了解更多信息,请参阅此文档: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

答案 1 :(得分:0)

抱歉,您让我意识到您无法在扩展程序中添加存储的属性。您只能添加计算属性。您可以将blackdot var添加为计算属性,或在主类中声明它而不是扩展名。如果您想尝试计算方式,请使用:

extension ChangingDots { 
   var blackdot:Type? { // Replace Type with SKSpriteNode type returned
       return SKSpriteNode(imageNamed: "AppIcon")
   }
   override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     super.touchesBegan(touches, with: event)
     for touch in touches {
       let locationUser = touch.location(in: self)
       if atPoint(locationUser) == DCButton {
         blackdot = SKSpriteNode(imageNamed: "AppIcon") //<--var I want to use
       }
     }
   }
}

这样,您的blackdot var仅 gettable且无法设置。如果你想添加设置它的可能性,你需要添加一个这样的setter:

var blackdot:Type? { // Replace Type with SKSpriteNode type returned
   get {
       return SKSpriteNode(imageNamed: "AppIcon")
   }
   set(newImage) {
       ...
   }
}

答案 2 :(得分:0)

只是在这里添加,有一些方法可以“解决”在扩展中添加存储的属性。以下文章介绍了如何执行此操作:https://medium.com/@ttikitu/swift-extensions-can-add-stored-properties-92db66bce6cd

但是,如果是我,我会将属性添加到您的主类。扩展旨在扩展类的行为。在您的扩展程序上创建主类依赖项似乎不是正确的设计方法。

如果您想将其设为私有,则可以使用fileprivate,以便您的分机可以访问它,但保持其“私密”访问权限。例如:

fileprivate var value: Object? = nil