'计算'不能在类型' ViewController'

时间:2016-08-07 17:41:52

标签: ios swift

我遇到了将值传递给swift中的类的问题。我有ViewControler.swift创建对象和其他UI类型的东西。这是代码:

class ViewController: UIViewController {


    //creates the Intractive button objects

    @IBOutlet var Bag1: UIButton!

    @IBOutlet var Bag2: UIButton!

    @IBOutlet var Bag3: UIButton!

    @IBOutlet var lblTokenSlider: UILabel!
    @IBOutlet var slider: UIStepper!

    @IBOutlet var Go: UIButton!

    @IBOutlet var counter: UILabel!


    var count  = 10
    var noOfBags = 3
    //gives acces to game AP!
    var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags )

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        lblTokenSlider.hidden = true
        slider.hidden = true
        Go.hidden = true
        counter.hidden = true
        Bag3.hidden = false
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // Event Drivers

    @IBAction func btnBag1(sender: AnyObject) {
        Bag1.userInteractionEnabled = false
        Bag2.userInteractionEnabled = false
        Bag3.userInteractionEnabled = false

    }


    @IBAction func btnBag2(sender: AnyObject) {

    }

    @IBAction func btnBag3(sender: AnyObject) {

    }

    @IBAction func SliderAction(sender: AnyObject) {

    }
    @IBAction func RemoveTokens(sender: AnyObject) {
    }

    }
}

这是我的gameAPI:

import Foundation

private enum MoveError: ErrorType {
    case Empty
}
class GameAPI {
    var noOfBags: Int
    var bagArray:[Bag] = []

    init(noOfBags: Int, noOfTokens : Int){
        self.noOfBags = noOfBags
        for _ in 0..<noOfBags {
            bagArray.append(Bag(counter: noOfTokens))
        }
    }

    /* Returns the amount of counters are in a bag */
    func getCounts(i :Int ) -> Int {
        return bagArray[i].getCount()
    }

    func isBagEmpty(i: Int) -> Bool {
        if (bagArray[i].getCount() <= 0){
            return true
        }
        else {
            return false
        }
    }

    func removeCounter(bagToRemove: Int, counters: Int ) throws{
        do {
            try self.bagArray[bagToRemove].removeCount(counters)
        }
        catch{
            throw MoveError.Empty
        }
    }

}

问题是我在ViewController中声明GameAPI然后得到的 &#39;实例成员&#39;计数&#39;不能用于类型&#39; ViewController&#39;&#39;  在线 var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags )

但是,如果我要切换变量并使用固定值,如: var gameAPI = GameAPI(noOfBags: 10, noOfTokens: 3 )

工作正常。我真的不明白为什么这不起作用。

谢谢

3 个答案:

答案 0 :(得分:1)

问题是您使用另一个实例变量来获取实例变量的初始值。通常,在初始化所有实例变量之前,不能使用实例变量。因此,您必须打破实例变量之间的依赖关系。

您有几种选择:

  1. 将初始化移至ininitalizer。但count有点困难,因为你需要至少两个初始化器,导致代码重复:

    noOfBags
  2. static let count = 10 static let noOfBags = 3 GameAPI声明为全局常量:

    self

    因此,count初始值设定项不会使用noOfBags

  3. 如果您需要initialCountinitialNoOfBags作为变量,则可以创建全局常量var count = initialCount var noOfBags = initialNoOfBags var gameAPI = GameAPI(noOfBags: initialCount, noOfTokens: initialNoOfBags) gameAPI,然后

    lazy var gameAPI: GameAPI = GameAPI(noOfBags: self.count, noOfTokens: self.noOfBags)
    
  4. 您可以懒惰地初始化[_tableView beginUpdates]; [_tableView endUpdates];

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return  UITableViewAutomaticDimension
    }
    

答案 1 :(得分:0)

这是因为你只能在ViewController类的任何方法之外声明变量。但你不能在任何方法之外分配任何变量。

假设您要声明一个变量,如:

let tempVar = 0

这不在方法之内,而是在视图控制器类中,如:

import UIKit

class ViewController: UIViewController {

    let tempVar = 0
}

现在,如果您在类中创建另一个变量,如:

import UIKit

class ViewController: UIViewController {

    let tempVar = 0

    let tempVar2 = tempVar
}

并且您为该变量tempVar2提供的值为tempVar。这会给你一个错误:

Instance member 'tempVar' cannot be used on type 'ViewController'

您收到此信息是因为您要在错误的地方为tempVar2实例分配值。您可以通过以下方式将值分配到viewDidLoad方法或任何其他方法来解决此错误:

import UIKit

class ViewController: UIViewController {

    let tempVar = 0

    var tempVar2 = 1

    override func viewDidLoad() {

        tempVar2 = tempVar
    }
}

答案 2 :(得分:-1)

在Swift中,您无法在属性初始值设定项中使用实例属性,因为属性初始值设定项在“self”可用之前运行。

您可以通过将gameAPI变量改为计算属性来解决此问题。

所以而不是:

var count  = 10
var noOfBags = 3
var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags)

试试这个:

var count  = 10
var noOfBags = 3
var gameAPI: GameAPI {
    return GameAPI(noOfBags: count, noOfTokens: noOfBags)
}