2016-08-07 43 views
1

我有一個問題,將值傳遞給swift中的類。我有ViewControler.swift創建對象和其他UI類型的東西。下面是代碼:「計數」不能用於'ViewController'類型

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,我得到 「實例成員‘計數’不能在類型使用「的ViewController」」 上線 var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags)

但是,如果我是切換變量並使用固定值,如: var gameAPI = GameAPI(noOfBags: 10, noOfTokens: 3)

它工作正常。我真的不明白爲什麼這不起作用。

謝謝

回答

1

的問題是,你必須使用另一個實例變量實例變量的初始化。通常,在所有實例變量初始化之前,您不能使用實例變量。因此你必須打破實例變量之間的依賴關係。

您有幾種選擇:

  1. 移動你的初始化到ininitalizer。這是一個有點困難UIViewController但因爲你至少需要兩個初始化,導致重複代碼:

    init(...) { 
        let count = 10 
        let noOfBags = 3 
    
        self.count = count 
        self.noOfBags = noOfBags 
        self.gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags) 
    
        super.init(...) 
    } 
    
  2. 聲明countnoOfBags爲全局常量:

    static let count = 10 
    static let noOfBags = 3 
    

    因此您GameAPI初始不會使用self

  3. 如果您需要countnoOfBags作爲變量,您可以創建全局常量initialCountinitialNoOfBags然後

    var count = initialCount 
    var noOfBags = initialNoOfBags 
    var gameAPI = GameAPI(noOfBags: initialCount, noOfTokens: initialNoOfBags) 
    
  4. 就可以初始化你gameAPI懶洋洋地:

    lazy var gameAPI: GameAPI = GameAPI(noOfBags: self.count, noOfTokens: self.noOfBags) 
    
+0

@Hamish感謝您的評論,我不知道偷懶變量的語法,因爲我不使用它們經常。 – Sulthan

+0

沒問題:)我已經刪除了我的評論,現在你已經做出了改變。 – Hamish

+0

謝謝!我使用了靜態,我嘗試了你的第四個建議,但是出現錯誤''Value'type'NSObject - >() - > ViewController'沒有成員'count''' – Osian

-1

在Swift中不能使用屬性初始值設定項中的實例屬性,因爲prope rty初始化器在'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) 
} 
+0

也許你不想要一個計算變量,而是一個懶惰的初始化。巨大差距。 – Sulthan

+0

在這種情況下計算變量的問題是什麼? – nathan

+1

每次調用它時都會創建一個新實例。因此,你不能改變它,因爲第二次調用它時,你將再次得到一個新的實例。 – Sulthan

0

這是因爲你只能在你的ViewController類中聲明的任何方法以外的變量。但不能在任何方法外分配任何變量。

假設你正在聲明一個變量,如:

let tempVar = 0 

這是方法,但是你的視圖控制器類像境內關外:

import UIKit 

class ViewController: UIViewController { 

    let tempVar = 0 
} 

現在,如果你的內心你的類一樣創建另一個變量:

而你給這個變量的值tempVar2tempVar。這將給你喜歡的錯誤:

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 
    } 
} 
+0

而不是默認值,您可以使變量隱式解包可選。這在2階段初始化中很常見。 – Sulthan

+0

@Sulthan感謝您的評論。但我試圖用非常簡單的例子來解釋他...... –

相關問題