[iOS] 함수 & 클로저 function & closure

Madeline👩🏻‍💻·2023년 5월 22일
0

iOS study

목록 보기
6/61
post-thumbnail

애플 개발자 아카데미 어느덧 3달째,
다른 사람 속도 따라잡느라 대충대충했던 스위프트 문법을 다시 차근차근 공부해보자!

함수

input parameter 받기

  • 함수는 필요한 데이터를 받을 수 있다
  • 넘겨 받을 인풋에 대해서,
    이름, 타입을 지정해준다. -> ()안에 !
func printName(name: String){
	print("name is \(name)")
}
printName(name: "Madeline")
//"name is Madeline"

🫧 input parameter label

parameter 를 호출하는 외부, 내부 관점에서 보았을 때, 이름을 다르게 하는 것이 더 자연스러울 때가 있다.

  • 결국 코드는 가독성을 높이기 위함임!!
func printName(of name: String){
	print("name is \(name)")
}
printName(of: "Madeline")
//"name is Madeline"


//외부 파라미터 생략 가능
//호출할 때 읽기 더 쉬움
func printName(_ name: String){
	print("name is \(name)")
}
printName("Madeline")
//"name is Madeline"

func printName(of name: String){
print("name is (name)")
}
of : 외부에서 사용되는 이름
name : 내부에서 사용(호출할 때 x)

output 값 반환하기

  • return 키워드 사용
func makeDouble(num: Int) -> Int{
	return num * 2
}
let result = makeDouble(3)
print(result)
//6

🫧 default parameter

  • 파라미터에 기본값을 설정해줄 수 있다.
func discount(price: Double, ratio : Double = 0.2) -> Double{
	return price(1-ratio)
}

let defaultRatioApplied = discount(price: 2000)

let customRatioApplied = discount(price : 2000, ratio: 0.5)

기본값 설정해놓고, 커스텀할 수도 있네~_~

  • 함수 이름은 뭐하는애인지 잘 쓰는게 너무 중요함!🌟

variadic function

  • 정해지지 않은 수의 여러 파라미터를 받을 수 있는 형태의 함수
  • print()가 여기에 속해
  • 함수 내부적으로 받은 파라미터를 배열의 형태로 받음
func printNames(_ names: String...){
	for name in names{
    	print("name is \(name)")
    }
}

printNames("James", "Joy","Jake")
//name is James
//name is Joy
//name is Jake

throwing function

  • 함수에서 예외 상황 처리
  • 잘못된 인풋, 네트워크 끊김, ...
  • throws가 있는 함수는 try를 이용해서 호출, do-catch로 에러 감지
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 : 50, divisor : 6)
    //divisor를 0으로 설정하면 에러 감지
    print(result
} catch {
	print(error.localizedDescription)
}

in-out parameter

  • 함수에서 넘겨 받는 input parameter는 constant 임

예를 들어,

func divide(dividend: Int, divisor : Int) throws -> Int{
if divisor == 0{
throw DivideError.cannotZero
}
//dividend = 50
//=> error
return Int(dividend / divisor)
}

이 함수에서 dividend는 상수임.
-> 값을 변경할 수 없음

  • 값 변경 X
  • input을 이용하면 변경 가능! -> 원래 값도 변경됨
func makeTriple(num : inout Int){
	num *= 3
    //num에 새로운 값 할당!
}
var num = 8
makeTriple(num: &num)
print(num)
//24

클로저

클로저가 뭐야

  • 함수처럼 태스크 수행하기 위한 코드 블록, 이름이 있으면 = 함수, 없으면 그냥 클로저

형태

{(parameter) -> return type in
	statements
}
  • in 기준으로 클로저 선언부, 클로저 실행부가 나뉨

클로저 선언부 : 파라미터와 리턴타입을 명시해둔다.
클로저 실행부 : 실행 코드

  • 함수, 클로저를 타입으로 사용할 수 있다!

클로저 만들어

let checking = {
	print("checking"
}
checking()

input parameter

let checking = { (id: String) in
	print("checking \(id)"
}
checking("maddy")
//"checking maddy)"

반환값

let checking = { (id: String) -> Bool in
	if id == "maddy"{
    	return true
    }
    return false
}
let isValid = checking("maddy")//true

🫧 closure as parameter

  • 클로저를 파라미터로 사용
func validate(id: String, checking: (String) -> Bool) -> Bool{
	print("ready for validaiton")
    let isValid = checking(id)
    return isValid
}

let validationResult = validate(id:("maddy"), checking : checking)//true
  • input, output이 없는 클로저
let printHello = { () -> Void in
	print("hello swift")
}

func doSomeClosure(_ action:() -> Void){
actoin()
}
doSomeClosure(printHello)
  • 클로저를 따로 만들어놓지 않고, 함수 수행시 바로 작성하기

🫧 closure 줄여보기

let validationResult3 = validate(id: "maddy", checking:{(id: String) -> Bool in
	if id == "maddy"{
    	return true
    }
    return false
})

얘를 줄여보자

let validationResult3 = validate(id: "maddy", checking: { id in
	if id == "maddy"{
    	return true
    }
    return false
})

1) 선언부
-> 코드 안에서 리턴값이 bool이니까, 리턴값은 없애도 됨!
시스템이 추론함

let validationResult3 = validate(id: "maddy", checking: { id in
	let isValid = id == "maddy"
    return isValid
})

2) 실행코드
id가 maddy 이면 true, 아니면 false!!

어렵다잉

3) id in 선언부를 없애도돼(파라미터를 $0로!), return도 생략 가능

let validationResult3 = validate(id: "maddy", checking: { $0 == "maddy"
})

요렇게 줄일 수 있다!

let validationResult3 = validate(id: "maddy" { $0 == "maddy"
})

-> trailing closure 🫧

이렇게도,,,

profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기

0개의 댓글