如何访问另一个类中的扩展的var?
我正在使用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)
没有人有从另一个改变一个类的按钮图片更好的主意?
对不起,但你让我意识到,你不能在扩展中添加存储的属性。您只能添加计算的属性。您可以将您的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) {
...
}
}
如果你想在主类中使用一个变量,它需要在主类中创建。扩展旨在扩展功能,这意味着函数和计算属性。
要了解更多信息,请参阅本文档: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html
我的最终目标是制作一个设置viewCotroller,用户可以在其中更改按钮图像。你有更好的方法来解决这个问题吗? @KnightofDragon – Jay23
我想补充在这里,有办法“解决办法”中的扩展将存储性能。这篇文章介绍了如何做到这一点:https://medium.com/@ttikitu/swift-extensions-can-add-stored-properties-92db66bce6cd
但是,如果是我,我会将该属性添加到您的主类。扩展是为了扩展一个类的行为。它似乎不是一个正确的设计方法,使您的扩展主要类的依赖。
如果你想使它私密,你可以使用fileprivate,以便你的扩展可以访问它,但保持它的“私人”访问。例如:
fileprivate var value: Object? = nil
我想创建一个设置viewCotroller,用户可以在其中更改按钮图像@Shawn – Jay23
我以为你不能在扩展中做存储的属性,只能计算 – Knight0fDragon
我得到的错误:使用未声明的类型'类型'。在行var黑点:类型?@ Arrabidas92 – Jay23
您需要替换类型与您的希望类型SKSpriteNode返回 – Arrabidas92