전세계적으로 코로나19가 기승이네요...
다들 몸조리 잘하시고 마스크 착용과 손씻기 잊지마세요~
오늘의 학습 주제는 스위프트5의 함수와 메서드, 클로저입니다
함수(Function)는 특정 작업을 수행하기 위해
호출할 수 있도록 이름 붙여진 코드 블록을 말하고
메서드(Method)는 특정 클래스나 구조체 또는 열거형과 연관된 함수를 말합니다
메서드는 스위프트5의 클래스(Class)에 대해
학습할 때 또 언급될 것이기 때문에 여기서는 생략하겠습니다
func sayHello() {
print("Hello")
}
func buildMessageFor1(name: String, count: Int) -> String {
return "\(name), you are customer number \(count)"
}
func buildMessageFor2(_ name: String, _ count: Int) -> String {
"\(name), you are customer number \(count)"
}
func buildMessageFor3(userName name: String, userCount count: Int) -> String {
"\(name), you are customer number \(count)"
}
func buildMessageFor4(userName name: String = "GuruSa", userCount count: Int) -> String {
"\(name), you are customer number \(count)"
}
sayHello()
print(buildMessageFor1(name: "GuruSa", count: 10))
print(buildMessageFor2("GuruSa", 10))
print(buildMessageFor3(userName: "GuruSa", userCount: 10))
print(buildMessageFor4(userCount: 10))
함수를 통해 전달되는 각각의 인자(argument)는
함수가 받도록 구성된 매개변수(parameter)와 일치해야합니다
위의 코드에서 sayHello() 함수는 매개변수를 받지 않고
아무런 값도 반환하지 않는 함수로 단순히 sayHello()로 호출합니다
buildMessage1~4는 모두 같은 출력을 하도록 합니다
함수들을 살펴보기 전에 매개변수를 살펴보면
지역 매개변수명(local parameter name)과 외부 매개변수명(external parameter name)이 있습니다
2번 함수에서는 _ 이 외부 매개변수명이고 name이 지역 매개변수명이 되겠습니다
외부 매개변수명을 _로 지정하면 호출시에 따로 매개변수 지정을 하지 않습니다
반면에 외부 매개변수를 userName이라 지정하면 반드시 외부 매개변수를 참조해야 합니다
또 4번 함수처럼 디폴트 매개변수를 선언할 수도 있네요~
func sizeConverter(_ length: Float) -> (yards: Float, centimeters: Float, meters: Float) {
let yards = length * 0.0277778
let centimeters = length * 2.54
let meters = length * 0.0254
return (yards, centimeters, meters)
}
let lengthTuple = sizeConverter(20)
print("Yards : \(lengthTuple.yards) Centimeters : \(lengthTuple.centimeters) Meters : \(lengthTuple.meters)")
func displayStrings(_ strings: String...) {
for string in strings {
print(string)
}
}
displayStrings("one", "two", "three", "four")
스위프트5는 위의 코드와 같이 결과값들을 튜플로 래핑하여
여러 개의 결과값을 반환할 수도 있고
가변개수 매개변수(variadic parameter)를 사용할 수 있습니다
함수하면 빼놓을 수 없는 이야기는 역시 값의 변환 문제인데요
아래의 코드를 보면 스위프트5의 값 변환 모습을 알 수 있습니다
var myValue = 10
func doubleValue(_ value: Int) -> Int {
var value = value
value += value
return value
}
func doubleValue2(_ value: inout Int) -> Int {
value += value
return value
}
print("Before function call myValue = \(myValue)")
print("doubleValue call returns \(doubleValue(myValue))")
print("After function call myValue = \(myValue)")
print("Before function call myValue = \(myValue)")
print("doubleValue call returns \(doubleValue2(&myValue))")
print("After function call myValue = \(myValue)")
doubleValue를 호출했을 때는 myValue의 값은 10 그대로이며
doubleValue2를 호출하면 myValue의 값은 20으로 변경됩니다
'inout' 키워드와 호출시에 '&'를 기억하세요!!
또 함수를 아래와 같이 상수에 할당해서 사용할 수 있습니다
func inchesToFeet(_ inches: Float) -> Float {
return inches * 0.0833333
}
func inchesToYards(_ inches: Float) -> Float {
return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYards = inchesToYards
func outputConversion(_ converterFunc: (Float) -> Float, value: Float) {
let result = converterFunc(value)
print("Result of conversion is \(result)")
}
outputConversion(toYards, value: 10)
outputConversion(toFeet, value: 10)
func decideFunction(_ feet: Bool) -> (Float) -> Float {
if feet {
return toFeet
} else {
return toYards
}
}
outputConversion(decideFunction(true), value: 10)
코드를 한 번 실행시켜보면서 이해해보세요!!
아래의 코드는 클로저(Closure)와 클로저 표현식(Closure expression)을 나타냅니다
//: Closure
let sayHello = { print("Hello") }
sayHello()
//: Closure expression
let multiply = {(_ val1: Int, _ val2: Int) -> Int in
return val1 * val2
}
let result = multiply(10, 20)
func functionA() -> () -> Int {
var counter = 0
func functionB() -> Int {
return counter + 10
}
return functionB
}
let myClosure = functionA()
print(myClosure())
클로저 표현식은 이름을 가지지 않고
함수는 이름을 가지는 클로저 표현식일 뿐입니다
클로저 표현식에서 'in' 키워드는 클로저 표현식 코드의 시작을 가리킵니다
이것으로 오늘의 학습을 마치도록 하겠습니다
그럼 이만-_-
'iOS' 카테고리의 다른 글
[iOS] 스위프트5 프로퍼티 레퍼와 에러 핸들링(Swift5 PropertyWrapper and Error Handling) (0) | 2020.03.26 |
---|---|
[iOS] 스위프트5 클래스와 구조체(Swift5 Class and Structure) (0) | 2020.03.25 |