【问题标题】:Why can I call my function in other functions' bodies but not in the class itself?为什么我可以在其他函数的主体中调用我的函数,但不能在类本身中调用我的函数?
【发布时间】:2016-07-05 22:10:49
【问题描述】:
import Foundation
import UIKit


class GameController: UIViewController {


@IBOutlet weak var gameImage: UIImageView!
@IBOutlet weak var softButton: UIButton!
@IBOutlet weak var notButton: UIButton!
@IBOutlet weak var scoreLabel: UILabel!
var timer = NSTimer()


override func viewDidLoad() {
    super.viewDidLoad()
    self.gameImage.image = UIImage(named: "king1")

}

//choose random image and set as game image
func randomGameImage() -> String {

    //these arrays hold the image names
    let kingArray = ["king1", "king2", "king3"]
    let notArray = ["not1", "not2", "not3"]

    //this number decides which array to pull from
    let randomNumber = Int(arc4random_uniform(2))

    //this number picks what image from the array
    let imageNumber = Int(arc4random_uniform(3))

    //holds the name of the image
    var gameImageString:String

    //sets image name
    if randomNumber >= 1 {

        gameImageString = kingArray[imageNumber]

    }else{

        gameImageString = notArray[imageNumber]

    }

    //sets image
    self.gameImage.image = UIImage(named: gameImageString)

    //returns name of image
    return gameImageString
}

var bool = true
var score = 0;
var imageShowing:String = randomGameImage()//"king"

(在“GameController”类型上使用实例方法“randomGameImage”;您的意思是使用“GameController”类型的值吗?)

@IBAction func kingTapped(sender: AnyObject) {

    if imageShowing.rangeOfString("king") != nil {
        score += 1
        scoreLabel.text = String(score)
        imageShowing = randomGameImage()

    }else{
        performSegueWithIdentifier("gameOver", sender: bool)

    }
}

@IBAction func notTapped(sender: AnyObject) {

    if imageShowing.rangeOfString("not") != nil {
        score += 1
        scoreLabel.text = String(score)
        imageShowing = randomGameImage()

    }else{
        performSegueWithIdentifier("gameOver", sender: bool)

    }
}



}

谁能告诉我为什么我可以在其他方法中调用 randomGameImage 方法,但不能在方法之外。对不起,我是一个编程菜鸟。

【问题讨论】:

    标签: swift


    【解决方案1】:

    原因同上: Swift Computed properties cannot be used in init?

    在 Swift 的两阶段初始化中,在完成阶段 1 之前,您无法访问 self。并且在调用init 之前,在第一阶段的第一阶段为属性分配默认值。因此,您不能在存储属性的默认值表达式中使用self,这意味着您不能调用实例方法,也不能使用其他实例属性。

    您可以使用类方法或全局函数作为初始值。

    【讨论】:

    • 我没有广泛的编程术语知识。如果你不介意你能解释一下......我可以让 randomGameImage 成为一个类方法吗?这似乎有点荒谬,我应该如何使用我编写的函数/方法?
    • 您的randomGameImage() 正在访问可能尚未初始化的实例属性self.gameImage。因此,删除该行,您可以将其设为类方法。只需在 func randomGameImage() 之前添加前缀 class。但是你需要修改一些其他的部分。
    • 因此,即使该方法不包含实例属性,如果参数是实例属性,您也会得到相同的错误,对吗?
    • 对,它包含在“其他一些部分”中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多