我正在使用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)
有没有人有更好的想法改变一个班级的按钮图片?
答案 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