from. 코드스타터 노션
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
Argument는 function parameter list와 순서가 같아야 한다
(그렇지 않은 언어도 있다고 한다. 아마.. C#, 코틀린?)
Default를 제공하면 optional하게 Agument를 안 넣어줘도 동작한다
이름 명확하게 잘 짓자
Function name이 같더라도 parameter list가 다르면 다른 함수처럼 사용할 수 있다
call할 때 넣는 parameter list에 따라 선택됨
return이 없는 Function도 엄밀히 말하면 Void 타입(=empty tuple)을 return하는 것
return이 있는 Function을 사용할 때 return value를 안 쓰면 compile 에러난다
아래와 같은 syntax가 추천됨
func printAndCount(string: String) -> Int {
print(string)
return string.count
}
func printWithoutCounting(string: String) {
let _ = printAndCount(string: string)
}
//예시
//array가 empty인 경우 (min,max)가 nil이 되어 runtime error 발생
//(min: Int, max: Int) 뒤에 ?를 추가하여 해결
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
var arr: [Int] = [Int]()
if let ret = minMax(array:arr){
print(ret.min, ret.max)
}
//추가로
(Int?, Int?)와 (Int, Int)?는 다르다
func greeting(for person: String) -> String {
"Hello, " + person + "!"
}
func minMax(a aa:Int, a bb:Int){
print("haha")
}
minMax(a:1, a:1)
//끝으로 몰아놓지 않으면 확실히 보기 안좋다
func abcd(a: Int = 1, b: Int, c: Int = 2){
print("haha")
}
abcd(b:2, c:3)
abcd(a:1, b:2)
```swift
func arithmeticMean(a numbers: Double...){
var total: Double = 0
for number in numbers {
print(number)
total += number
}
}
arithmeticMean(a:1,2)
arithmeticMean(a:1,a:2) //예상과 다르게 이렇게 쓰면 안됨
```
위와 같은 특징 때문에 가변 param 뒤에 오는 param은 Argument Label로 언더바를 사용할 수 없다```swift
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
```
```swift
//stepForward와 stepBackward는 Nested Function이지만
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
//return에 의해 moveNearerToZero로 외부에서 사용할 수 있게 됨
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
```