함수(Functions)
상수(Constant)와 가변(Variable) 파라메터
함수의 파라미터들은 기본적으로 상수들입니다.
그런데 파라미터를 변수로 사용하고 싶을때는 파라미터 이름 앞에 var을 붙여주면 됩니다.
func alignRight(var string: String, count: Int, pad: Character) -> 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(originalString, 10, "-") // paddedString is equal to "-----hello" // originalString is still equal to "hello"
가변파라미터는 오직 함수 자신 내부에서만 변경될수 있습니다.
값을 변경하고 함수 호출이 종료된 후에도 계속 값이 유지되길 원한다면 inout 키원드를 사용합니다.
다음 예제는 입력된 두 값을 교환합니다.
func swapTwoInts(inout a: Int, inout b: Int) { 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(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = sorted(names, backwards) // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
정렬 기능의 함수를 정의할 수 도 있지만 클로저를 사용하면 다음과 같이
입력 파라미터에 즉시 코드를 작성가능합니다.
reversed = sorted(names, { (s1: String, s2: String) -> 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 Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
열겨형을 스위치 문과 같이 쓰기
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(Int, Int, Int, Int) case QRCode(String) }
그럼 이제 2가지 방식으로 값을 저장할 수 있습니다.
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3) productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
그리고 요딴식으로 사용합니다.
switch productBarcode { case .UPCA(let numberSystem, let manufacturer, let product, let check): println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).") case .QRCode(let productCode): println("QR code: \(productCode).") } // prints "QR code: ABCDEFGHIJKLMNOP."
원시값(Raw Values)
지금까지 열거형 멤버들에 값을 저장하는 방법을 배웠습니다.
다른 방법으로 기본값들로 미리 채워 질 수 있습니다.
enum ASCIIControlCharacter: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" }
이렇게 열거형 이름 뒤에 변수 타입을 적어 주면 됩니다.
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
이경우 Venus = 2 , Earth = 3 .... 이렇게 자동 증가 되어 값이 설정됩니다.