스위프트는 함수형 프로그래밍 패러다임을 채택하고 있는 언어.
인자와 반환값 타입을 명시. nil
반환 가능성이 있는 경우, 반환 타입을 옵셔널 타입으로 명시.
func add_five(x: Int) -> Int {
let result = x + 5
return result
}
let x = 10
print(add_five(x: x)) // 15
//
func hello(name: String?){
guard let _name = name else {
return
}
print("Hello, \(_name).")
}
hello(name: "한음")
let optName: String? = "한음"
print(optName) // Optional("한음")
hello(name: optName)
//
func multiply(x: Int, y: Int) -> Int {
return x * y
}
print(multiply(x:y:)(3,5)) // 이런식으로 호출도 가능하다.
튜플로 여러 값 반환시 함수 정의 단계에서 미리 변수명을 바인딩 할 수 있다.
func example() -> (num: Int, str: String){
return (10, "HELLO")
}
let a = example()
print(a.num) // 10
print(a.str) // HELLO
특정 튜플이 여러 곳에서 사용될 경우, Type Alias 를 통해 새로운 축약형 타입을 정의할 수 있다.
typealias result = (Int, Character, String)
func example() -> result {
let c: Character = "C"
return (10, c, "It Works Like This")
}
let e = example()
print(e.0) // 10
print(e.1) // c
print(e.2) // It Works Like This
// 변수명 바인딩도 가능
typealias result = (int: Int, chr: Character, str: String)
func example() -> result {
let c: Character = "C"
return (10, c, "It Works Like This")
}
let e = example()
print(e.int) // 10
print(e.chr) // c
print(e.str) // It Works Like This
용도에 따라 매개변수를 두 가지로 분리.
별도로 외부 매개변수를 나누지 않을 경우 일반 매개변수가 인자 레이블 역할까지 겸하지만, 외부 매개변수를 명시적으로 정의하면 외부 매개변수가 인자 레이블이 됨.
func ex(out1 inner1: String, out2 inner2: Int){
print(inner1)
print(inner2)
}
// 이때 함수명은 ex(out1:out2:) 이다.
ex(out1: "Hello", out2: 123) // 호출.
위의 설명처럼, 외부 매개변수를 별도 설정하지 않을 시 일반 매개변수가 외부 매개변수 역할까지 하는 것.
** 외부 매개변수로 _ 를 두면, 외부 매개변수 생략이 가능해진다
func ex(_ inner1: String, _ inner2: Int){
print(inner1)
print(inner2)
}
ex("HELLO", 123) // ** 매개변수 레이블 없이 사용 가능
// 이때 함수명은 ex(_:_:) 가 된다.
//
func ex(_ inner1: String, outer2 inner2: Int){
// _ 를 두는 위치는 상관 없다.
print(inner1)
print(inner2)
}
ex("HELLO", outer2: 123) // 두 번째 인자는 레이블을 적어야 한다.
// 이때 함수명은 ex(_:outer2:) 가 된다.
스위프트는 함수를 타입, 인자의 개수로 구별하는 것이 아닌 레이블로 구별한다.
func ex(a: String){
print(a)
}
func ex(b: String){
print(123)
}
ex(a: "Hello") // Hello
ex(b: "Hello") // 123
...
을 이용.
func average(score: Int...) -> Int {
var total = 0
for s in score{
total += s
}
return total
}
print(average(score: 1, 23, 42)) // 66
레이블이 있으므로 파이썬과 달리 가변인자를 앞 쪽에 쓰는것이 가능.
func average(score: Int..., num: Int) -> Int {
var total = 0
for s in score{
total += s
}
print(num)
return total
}
print(average(score: 1, 23, 42, num: 15)) // 66
인자값 생략 가능.
func defaultFunc(message: String, work: Bool = true) {
guard work else {
return
}
print(message)
}
defaultFunc(message: "HELLO") // HELLO
defaultFunc(message: "HELLO", work: false) // return
defaultFunc(message:work:)("HELLO") // 함수 이름은 defaultFunc(message:work:) 이다.
함수의 인자값이 상수로 정의됨. (let)
마음대로 변경하려 하면 오류 발생.
다른 언어들과 큰 차이 중 하나.
func ex(num: Int) -> Int {
num += 1 // 오류
return num
}
인자 값을 변경해서 사용하려면 또 복사하는 변수를 만들어야 함. 이때 같은 이름으로도 정의 가능한게 특이.
func ex(_ num: Int) -> Int {
var num = num
num += 1
return num
}
print(ex(123)) // 124