我正在做这个应用程序,当我在函数外部调用变量时,它将无法识别它,如下所示
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var monsterImg: MonsterAnimation!
@IBOutlet weak var heartImg: DragImages!
@IBOutlet weak var foodImg: DragImages!
// Skulls on Top Board
@IBOutlet weak var penalty1Img: UIImageView!
@IBOutlet weak var penalty2Img: UIImageView!
@IBOutlet weak var penalty3Img: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Skulls Alpha Manipulation
let DIM_ALPHA: CGFloat = 0.2
let OPAQUE: CGFloat = 1.0
let MAX_PENALTIES = 3
var penalties = 0 // VARIABLE NOT ABLE TO BE SEEN IN FUNCTION ALSO ABOVE ^^^
foodImg.dropTarget = monsterImg
heartImg.dropTarget = monsterImg
// Skulls Alpha Initalzation
penalty1Img.alpha = DIM_ALPHA
penalty2Img.alpha = DIM_ALPHA
penalty3Img.alpha = DIM_ALPHA
NSNotificationCenter.defaultCenter().addObserver(self, selector: "itemDroppedOnCharacter:", name: "onTargetDropped", object: nil)
}
func itemDroppedOnCharacter(notif: AnyObject) {
}
func startSkullTimer() {
var skullTimer: NSTimer!
if skullTimer != nil {
skullTimer.invalidate()
}
skullTimer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "changeGameState", userInfo: nil, repeats: true)
}
func changeGameState() {
penalties++ // HERE IT"S NOT ABLE TO SEE THE VARIABLE ABOVE
}
但是当我把它放在它运作的函数中但是其他变量和东西不能识别它,因为它在函数中。我如何解决这个问题,这样函数会识别变量的一面呢?
答案 0 :(得分:1)
只需将您的变量与您的IBOutlets一起声明在viewDidLoad()
之外。
如果你想给它们初始值,你可以在声明时直接指定,或者只是给出一个类型并在viewDidLoad()
中再次设置值
有关访问控制主题的更多信息,请阅读Apple文档: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html
答案 1 :(得分:1)
欢迎来到SO。您正面临"范围"的问题。在内部作用域(如函数)中定义的变量只能在该内部作用域(函数)中访问。退出函数后,变量"超出范围"并被遗忘。
将范围视为一组圆圈。圆(范围)中定义的变量仅在该圆内可见。较大圆圈内的圆圈可以访问外圆中定义的变量。 (内部范围可以访问封闭范围。)
函数有一个"包含范围"它们的定义。如果函数是类的实例方法,则它可以访问对象中的实例变量。
因此,如果您需要两个函数来访问同一个变量,那么该变量需要位于一个共同的外部范围内。 (或者,如果一个函数调用另一个函数,则可以将值作为参数传递。)同样,对于实例方法,使值使两个函数都需要类的实例变量可能是有意义的。
在您的情况下,这些是视图控制器的实例方法,因此您只需要使penalties
变量成为视图控制器的实例变量。你可以通过在函数之外移动它的声明并进入ViewController
类声明的顶部来实现。