2017-10-28 159 views
1

我正在使用Sprite Kit。我想用设置类来更改主类的按钮图片。我如何使扩展中的变量(来自设置类)可用于主类?如何访问另一个类中的扩展的var?

这里是扩展:

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) 

没有人有从另一个改变一个类的按钮图片更好的主意?

回答

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变种只有gettable和不可设置。如果你想添加的可能性来设置它,你需要添加一个setter这样的:

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

我以为你不能在扩展中做存储的属性,只能计算 – Knight0fDragon

+0

我得到的错误:使用未声明的类型'类型'。在行var黑点:类型?@ Arrabidas92 – Jay23

+0

您需要替换类型与您的希望类型SKSpriteNode返回 – Arrabidas92

1

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

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

+0

我的最终目标是制作一个设置viewCotroller,用户可以在其中更改按钮图像。你有更好的方法来解决这个问题吗? @KnightofDragon – Jay23

0

我想补充在这里,有办法“解决办法”中的扩展将存储性能。这篇文章介绍了如何做到这一点:https://medium.com/@ttikitu/swift-extensions-can-add-stored-properties-92db66bce6cd

但是,如果是我,我会将该属性添加到您的主类。扩展是为了扩展一个类的行为。它似乎不是一个正确的设计方法,使您的扩展主要类的依赖。

如果你想使它私密,你可以使用fileprivate,以便你的扩展可以访问它,但保持它的“私人”访问。例如:

fileprivate var value: Object? = nil 
+0

我想创建一个设置viewCotroller,用户可以在其中更改按钮图像@Shawn – Jay23

相关问题