3.5 Constant and Variable Scope


Scope


Global Scope

  • プログラム随所で利用可能なコード
  • // global variable
    var age = 55
     
    func printMyAge() {
      print(My age: \(age))
    }
     
    print(age)
    printMyAge()

    Local Scope


  • 構造、クラス、ifforloopなど{ }内部

  • localscopeで宣言された定数または変数は、外部領域では使用できません.
  • func printBottleCount() {
    
      // local constant
      let bottleCount = 99
      print(bottleCount)
    }
     
    printBottleCount()
    print(bottleCount) // Error

    Variable Shadowing


  • より狭いscopeで同じ名前の値を宣言し、外部scopeにある値を遮断します.

  • 適切に使用すれば、よりクリーンなコードを維持できます.
  • func printComplexScope() {
    
    	// function's local scope
        let points = 100
        print(points)
     
        for index in 1...3 {
        
        	// for loop's local scope
            // function's local scope를 완전히 가림(shadowing)
            // 이 곳에서는 100에 접근할 수 없다.
            let points = 200
            print(Loop \(index): \(points+index))
        }
     
        print(points)
    }
     
    printComplexScope()
    // console
    100
    Loop 1: 201
    Loop 2: 202
    Loop 3: 203
    100

    Variable Shadowingの使用例


    1. if let

  • if let同名定数にオプションで抽出した値を割り付け、内部使用に供する
  • func exclaim(name: String?) {
      if let name = name {
      
        // if let 내부에서의 `name`은 `String?`에서 값을 추출한 `String` 값이다.
        print(Exclaim function was passed: \(name))
      }
    }

    2. guard

  • guard同名定数に「オプション」から抽出した値を割り当てる
  • guard下のコードはオプション値に近づけない.
  • func exclaim(name: String?) {
      guard let name = name else { return }
      
      // `String?`값의 name은 더이상 접근할 수 없다.
      // `String`값의 name만 접근 가능
      print(Exclaim function was passed: \(name))
    }

    3. Initializer


  • initializerのパラメータ名をこのタイプのプロパティと同じに設定

  • イニシエータ内部

  • パラメータ値に名前でアクセス
  • selfキーワードでアクセス可能な属性
  • struct Person {
      var name: String
      var age: Int
    
      init(name: String, age: Int) {
      	// property에 parameter 값을 할당
        self.name = name
        self.age = age
      }
    }