函数

时间:2016-03-01 03:54:11

标签: ios swift swift2

我正在做这个应用程序,当我在函数外部调用变量时,它将无法识别它,如下所示

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

}

但是当我把它放在它运作的函数中但是其他变量和东西不能识别它,因为它在函数中。我如何解决这个问题,这样函数会识别变量的一面呢?

2 个答案:

答案 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类声明的顶部来实现。