함수는 인풋값에 따라 아웃풋 값이 나오는 구조이며 스위프트UI에서는 여러 함수 종류가 있습니다.
여러 함수에 대해서 하나씩 확인해보겠습니다.
1) 파라미터에 기본값을 설정해주는 함수 (default Parameter)
- 파라미터의 default 값을 정의하여 해당 함수 호출시 인자로 값을 넣지 않더라도 기본 값으로 정의되어 반환됨
func discount(_ price: Double, ratio: Double = 0.2) -> Double {
return price * (1-ratio)
}
let discountPrice = discount(10000)
/*
* _ price로 표시함으로써 바로 price 값을 넣어서 함수를 호출합니다.
* 여기서는 ratio 값을 넣지 않아도 기본 셋팅으로 (Default) 0.2를 넣어놨기 때문에
* 0.2가 적용되어 할인가격을 반환하게 됩니다.
*/
let discountPrice2 = discount(10000, ratio: 0.5)
// 이렇게 셋팅한다면 default로 정의된 0.2가 아니라 0.5로 할인률이 적용되어 값이 반환됩니다.
2) variadic function
- 정해지지 않은 수의 여러 파라미터를 받을 수 있는 형태의 함수를 의미하며 대표적으로 print() 함수가 있다.
- 함수 내부적으로 이렇게 받은 파라미터를 배열 형태로 받는다.
func printNames(_ names: String...) {
for name in names{
print("name is \(name)")
}
}
// 들어오는 변수가 문자열 형태인데 얼마나 들어올지 모른다. (배열 형태 느낌으로 파라미터를 설정)
// 값을 넣는건 주르륵 이렇게 많이 ~!
printNames("seongho", "nakyung")
3) throwing function
- 함수 수행간에 예외 상황이 일어날 수 있기에 예외처리를 함으로써 문제를 방지하는 함수
- throws를 붙여서 함수를 정의하고, 예외 상황에 대해서 throw를 정의한다.
- throws 키워드가 있는 함수는 try를 이용해서 호출하고, do-catch를 이용하여 에러를 탐지합니다.
// throwing function
enum DivideError: Error {
case cannotZero
}
func divide(dividend: Int, divisor: Int) throws -> Int {
if divisor == 0 {
throw DivideError.cannotZero
}
return Int(dividend / divisor)
}
do {
let result = try divide(dividend: 60, divisor: 6)
print(result)
} catch {
print(error.localizedDescription)
}
여기서 만약 divisor가 0으로 준다면 divide 함수에 throw로 걸려서 예외가 반환됩니다.
예외 내용은 작업을 제대로 수행할 수 없다는 메시지와 함꼐 DivideError의 cannotZero(error 0)이 출력됩니다.
따라서 오류 내용을 정의해서 예외처리를 하고 싶다면, enum으로 Error를 정의하고 case 별로 나누어 정의해둔 다음에
throw를 함수 내에서 정의할 때 (예외처리) 같이 호출해주면 됩니다.
보다 효율적인 예외처리와 어디서 문제가 발생했는지 빠르게 체크가 가능할 것이고 이를 위해서는
try 키워드를 통해 해당 정의된 함수를 호출하고, 그렇게 정의된 코드블록은 do 블록 안에, 오류 내용은 catch 블록안에 정의하면 됩니다.
4) In - Out parameter func
- 함수에서 파라미터로 넘겨받는 값은 상수이기 떄문에 값 변경이 기본적으로 되지 않습니다.
- inout을 넣어주면 input parameter로 들어온 값은 변경이 가능합니다. 오리지널 값도 변경됩니다.
func makeTriple(num: inout Int){
num *= 3
}
var value = 8
makeTriple(num: &value)
print(value)
// 24가 출력
inout으로 해서 다음과 같이 정의하게 된다면, 값을 따로 반환하는 함수가 아님에도 불구하고 value 값이 makeTriple inout 함수를 거쳐
24로 값이 셋팅됩니다. (8*3 = 24)
단, value라는 변수의 주소값을 inout의 값으로 (num) 넣어줌으로써 해당 오리지널 값이 변경되어 셋팅됩니다.
감사합니다 =D
'Swift-IOS' 카테고리의 다른 글
Swift: array, dictionary, set, tuple, enum (0) | 2023.01.17 |
---|---|
문자열 관리 (0) | 2023.01.17 |
반복문 (0) | 2023.01.17 |
옵셔널 변수 (0) | 2023.01.17 |