2017-11-09 20 views
0

サービスの回答を持つ変数provincias_wsを持っていますが、これまでのところすべては問題ありませんが、私がtextFieldDidBeginEditingメソッドで印刷したいので、provincias_ws変数がどのようになっているか知りたいのですがswiftのグローバル変数3

class ViewCtrl: UIViewController, ValidationDelegate, UITextFieldDelegate { 
    @IBOutlet weak var txt_ciudadU: SearchTextField! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     opciones_autocompletado() 
     txt_ciudadU.delegate = self 
    } 
    func opciones_autocompletado(){ 
     txt_provinciaU.inlineMode = true 
     txt_ciudadU.inlineMode = true 
     Services.objServices.ServProv().then{ 
      data -> Void in 
      let res = JSON(data) 
      let status = res["status"].boolValue 
      if(status){ 
       let provincias_ws = res["data"]["provincias"] //How to make this variable global 
      }else{ 
       let error = res["error"]["error_data"].stringValue 
       print(error) 
      } 
      SVProgressHUD.dismiss() 
      UIApplication.shared.endIgnoringInteractionEvents() 
      }.catch{ 
       error -> Void in 
       SVProgressHUD.dismiss() 
       UIApplication.shared.endIgnoringInteractionEvents() 
     } 
    } 
    func textFieldDidBeginEditing(_ textField: UITextField) { 
     print(provincias_ws) 
    } 
} 

+0

なぜあなたはそれをクラスインスタンス変数にしませんか? しかし、グローバルにしたい場合は 'class'ブロックの外で定義することができます。 – shim

+0

どうすればいいですか?私は素早く新しいです –

+0

あなたのテキストフィールド 'txt_ciudadU'は、クラスのインスタンス変数またはプロパティです。これは同じで、単に '@ IBOutlet'や' weak'もありません。したがって、おそらく 'var provincias_ws:String'(' String'と仮定します)のようなものになり、テキストフィールド変数と同じ階層レベルに置くことになります。そして、 'provincias_ws'の隣にある' let'を取り除き、 'self.provincias_ws = res [" data "] [" provincias "]')をブロックの中に入れておきます。文脈のためにそれを必要とする。 – shim

答えて

1

一つはクラスのブロックの外で、それを定義することにより(それはどこかのプロジェクトでからアクセスすることができ意味)「グローバル」変数を作成することができ、事前にありがとうございます。

ただし、クラスインスタンス変数が必要なようです。

テキストフィールドtxt_ciudadUはすでに、クラスViewCtrlのインスタンス変数またはプロパティの例です。

@IBOutlet weakを使用しない場合と同じです。

だから、おそらく(それは文字列だと仮定して)次のようになります。

var provincias_ws: String? 

は、それがあなたのブロックの内側に設定されるまで、それは設定されませんので、?は、オプションの値として、それを宣言しています。デフォルト値または空の値(例:var provincias_ws = "")に初期化することもできますし、!を使用すると、エラーが発生しやすいので頼りにしない方がいいかもしれませんが、ゼロになっても解除しないことを示すことができます。あなたの選択は、あなたの必要に応じて決まります。

これは、テキストフィールド変数と同じ階層レベル(つまり、右上または下位にありますが、関数や別のブロック内にない限り実際にはどこにでも置くことができます)に配置します。それはブロック内だから

そして、あなたはprovincias_wsの隣に現在のletを取り除くとself.すなわちでそれを付加なるだろう:

self.provincias_ws = res["data"]["provincias"] 

self.が必要であり、コンパイラは、コンテキストにいることを必要とします。

+0

同じことをしますが、このエラーが発生します: String型のインデックスを持つJSON型の値をサブスクライブできません –

+0

この 'JSON'オブジェクトを提供するライブラリは、文字列型の添え字をサポートしていませんあなたはやったことがあります(つまり 'res [" data "]')。それは実際にあなたの投稿の質問には関係しません。 – shim

+0

前にそのエラーが発生していないのですか?また、JSONデータの構造を決定するのに十分な情報を提供していないため、上記のvar(String)の型は単なる例に過ぎません。期待どおりに変更する必要があります。 – shim

関連する問題