post list

2015년 3월 28일 토요일

Swift(스위프트) 강좌 : 빠르게 시작하기 5

함수(Functions)

상수(Constant)와 가변(Variable) 파라메터


함수의 파라미터들은 기본적으로 상수들입니다. 
그런데 파라미터를 변수로 사용하고 싶을때는  파라미터 이름 앞에 var을 붙여주면 됩니다.
func alignRight(var stringStringcountIntpadCharacter) -> String {
  let amountToPad = count - countElements(string)
  if amountToPad < 1 {
  return string
}
  let padString = String(pad)
   for _ in 1...amountToPad {
      string = padString + string
}
  return string
}
  let originalString = "hello"
  let paddedString = alignRight(originalString10"-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"


가변파라미터는 오직 함수 자신 내부에서만 변경될수 있습니다. 
값을 변경하고 함수 호출이 종료된 후에도 계속 값이 유지되길 원한다면 inout 키원드를 사용합니다.
다음 예제는 입력된 두 값을 교환합니다.
func swapTwoInts(inout aIntinout bInt) {
  let temporaryA = a
  a = b
  b = temporaryA
}


클로저(Closures)


클로저는  objective-c 나 C 에서 블록(blocks)이랑 비슷합니다. 


클로저 표현 식은 다음과 같습니다.

{ (parameters) -> return type in
    statements
} 


블록을 쓰면  굳이 함수를 선언하지 않고  비교적 긴 코드를 캡슐화할 수 있습니다. 
예를 들어 다음과같이 정렬 기능을 하는 코드가 있습니다.
let names = ["Chris""Alex""Ewa""Barry""Daniella"]
      func backwards(s1Strings2String) -> Bool {   return s1 > s2 } var reversed = sorted(namesbackwards) // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

      정렬 기능의 함수를 정의할 수 도 있지만 클로저를 사용하면 다음과 같이 
      입력 파라미터에 즉시 코드를 작성가능합니다.
      reversed = sorted(names, { (s1Strings2String) -> Bool in return s1 > s2 } )   



      열거형(Enumerations)


      열거형의 표현식입니다.
      enum SomeEnumeration {
        // enumeration definition goes here
      }
       

      예를 들면 이런식으로 사용 됩니다.
      enum CompassPoint {   case North   case South   case East   case West }
        enum Planet {   case MercuryVenusEarthMarsJupiterSaturnUranusNeptune }

        열겨형을 스위치 문과 같이 쓰기
        var directionToHead = CompassPoint.West

        directionToHead 변수에 CompassPoint 타입이 초기화 되었습니다. 그럼  이 변수는 타입추정에 의해 다음부터 CompassPoint 를 생략하고 다른 값을 대입할 수 있습니다.

        directionToHead = .South
        switch directionToHead {
          case .North:
            println("Lots of planets have a north")
          case .South:
            println("Watch out for penguins")
          case .East:
            println("Where the sun rises")
          case .West:
            println("Where the skies are blue")
        }
        // prints "Watch out for penguins"

        연관 값(Associated Values)

        열거형을 이용해 값을 저장하는 것도 가능합니다.
        실생활에서 바코드는 2가지 타입이 사용 됩니다. 
        UPC-A바코드를 3개의 숫자 튜플로 저장하고 QR코드는 문자열로 저장하겠습니다. 
        enum Barcode {
          case UPCA(IntIntIntInt)
          case QRCode(String)
        }

        그럼 이제 2가지 방식으로 값을 저장할 수 있습니다.
        var productBarcode = Barcode.UPCA(885909512263)
        productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

        그리고 요딴식으로 사용합니다.
        switch productBarcode {
          case .UPCA(let numberSystemlet manufacturerlet productlet check):
            println("UPC-A: \(numberSystem)\(manufacturer)\(product)\(check).")
          case .QRCode(let productCode):
            println("QR code: \(productCode).")
        }
        // prints "QR code: ABCDEFGHIJKLMNOP."

        원시값(Raw Values)

        지금까지 열거형 멤버들에 값을 저장하는 방법을 배웠습니다. 
        다른 방법으로 기본값들로 미리 채워 질 수 있습니다.
        enum ASCIIControlCharacterCharacter {
          case Tab = "\t"
          case LineFeed = "\n"
          case CarriageReturn = "\r"
        }

        이렇게 열거형 이름 뒤에 변수 타입을 적어 주면 됩니다.
        enum PlanetInt {
          case Mercury = 1VenusEarthMarsJupiterSaturnUranusNeptune
        }


        이경우 Venus = 2 , Earth = 3 .... 이렇게 자동 증가 되어 값이 설정됩니다.