2016-08-07 4 views
1

swiftのクラスに値を渡す際に問題があります。オブジェクトを作成するViewControler.swiftと他のUIの種類のものがあります。ここでは、コードは次のようになります。'count'をタイプ '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にあなたの初期化を移動

    。あなたは、少なくとも2つの初期化子を必要とするので、それは重複をコーディングするリード、しかし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を使用してください。

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

@Hamish感謝し、私はそれらを使用していないので、私にはよく怠惰な変数の構文を知りません頻繁に。 – Sulthan

+0

問題はありません:)変更を加えたので、私のコメントを削除しました。 – Hamish

+0

ありがとうございました!私は静的を使用し、あなたの4番目の提案を試みましたが、 ''値の型 'NSObject - >() - > ViewController' 'メンバ' count'''がありませんでした。 – Osian

-1

で:あなたが変数としてcountnoOfBagsが必要な場合は

  • 、あなたはあなたがあなたのgameAPIいい加減に初期化することができ、その後グローバル定数initialCountinitialNoOfBags

    var count = initialCount 
    var noOfBags = initialNoOfBags 
    var gameAPI = GameAPI(noOfBags: initialCount, noOfTokens: initialNoOfBags) 
    
  • を作成することができます素早くプロパティ初期化子内でインスタンスプロパティを使用することはできません。prope rty初期化子は 'self'が利用可能になる前に実行されます。

    gameAPI変数を代わりに計算されたプロパティにすることでこれを修正できます。

    ので、代わりの:

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

    これを試してください:あなただけのViewControllerクラスのいずれかの方法の外に変数を宣言することができますので、

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

    おそらく、計算された変数を必要とせず、代わりに遅延初期化をしたいと思うでしょう。大きな違い。 – Sulthan

    +0

    この場合の計算された変数の問題点は何ですか? – nathan

    +1

    あなたはそれを呼び出すたびに新しいインスタンスを作成します。したがって、2回目に新しいインスタンスを再度取得するため、それを変更することはできません。 – Sulthan

    0

    それはです。どのメソッドの外にも変数を割り当てることはできません。あなたのようなあなたのクラス内の別の変数を作成した場合

    import UIKit 
    
    class ViewController: UIViewController { 
    
        let tempVar = 0 
    } 
    

    :ようなメソッドの外ではなく、あなたのビューコントローラクラスの内部にある

    let tempVar = 0 
    

    はあなたのような一つの変数を宣言していると仮定します。

    あなたはその変数に値を与えていますtempVar2tempVarです。どのようにあなたにエラーを与える:あなたは間違った場所でtempVar2インスタンスに値を代入しているので、あなたはこれを取得している

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

    。あなたはこのようviewDidLoad方法に、または任意の他の方法で値を割り当てることによって、このエラーを解決することができます。コメントを

    import UIKit 
    
    class ViewController: UIViewController { 
    
        let tempVar = 0 
    
        var tempVar2 = 1 
    
        override func viewDidLoad() { 
    
         tempVar2 = tempVar 
        } 
    } 
    
    +0

    デフォルト値の代わりに、変数を暗黙的にアンラップしたオプションにすることができます。これは2フェーズ初期化でよく起こります。 – Sulthan

    +0

    @Sulthanご意見ありがとうございます。しかし、私は非常に簡単な例で彼を説明しようとする.. :) –

    関連する問題