2017-11-09 6 views
0

변수의 provincias_ws는 서비스의 답을 가지고 있습니다. 지금까지는 모든 것이 괜찮지 만, 어떻게하면 provincias_ws 변수가 global인지 알기를 원합니다. 왜냐하면 textFieldDidBeginEditing 메소드에서 인쇄하기 때문에신속한 전역 변수 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 객체를 제공하는 라이브러리는 문자열 값을 가진 subscript를 지원하지 않습니다. (즉'res [ "data"]'). 게시물의 질문과 관련이 없습니다. – shim

+0

이전에 그 오류가 발생하지 않았습니까?또한 JSON 데이터의 구조를 결정할만큼 충분한 정보를 제공하지 못했기 때문에 위의 var 유형 (String)은 예일뿐입니다. 원하는대로 바꿔야합니다. – shim