[Swift][문법] Closure 3

Uno·2021년 8월 8일
0

Tip-Swift

목록 보기
13/26
post-custom-banner

"Level-up-swift" 강의를 참고해서 재구성했습니다. (in Udemy)


일반적인 클로저 예시


let closureExample = {
	let player = 10
	let computer = 5
	
	if player > computer {
		print("플레이어가 승리했습니다")
	} else {
		print("AI가 승리했습니다")		
  }
}

closureExample 이라는 상수에 클로저를 할당하고 있죠. 그리고 if 분기절에 따라서 다른 print문을 출력하고 있습니다.

이처럼 클로저는 할당할 수 있습니다.

호출 할때는 다음과 같이 호출하죠.

closureExample()

메소드를 하나 만들어 보고 그 메소드를 파라미터로 전달받아 보겠습니다.

func printSomething(text: String) { print(text) }

func printIt(closure: (String) -> Void) {
	let message = "안녕 친구"
	closure(message)
}

printIt(closure: printSomething)

변수에 할당한 클로저


클로저는 변수에 적용할 수도 있습니다.

var hello: () -> (String) = {
	return "Hello!"
}

hello()

var hello2 = {
	return "Hello!"
}

hello2()

파라미터로 값을 전달받아서 연산한 값을 리턴할 수 있습니다.

var double: (Int) -> (Int) = { x in
	return 2 * x 
}

구체적인 예시를 들자면, 디자이너분께 받은 스토리보드에 특정 기기에 맞춰서 이미지를 받는다고 가정해볼게요.

iOS 개발자는 하나의 스토리보드를 보고 모든 기기에 대응시켜야 합니다. 물론 비례식을 사용해서 매번 계산해서 할당해줄 수 있겠죠.

이번에 클로져를 배웠으니 이를 활용해보는 것도 좋아보입니다.

var convertedRatio: (Float) -> Float = { Float($0 / 812) }
convertedRatio(134)

클로저 축약문법


추가로 클로저를 이용한 축약문법 예시를 보겠습니다.

let names = ["우노", "모야", "김우노", "최모야", "박모야", "이우노", "정모야"]

func backward(_ s1: String, s2: String) -> Bool {
    return s1 > s2
}

backward(names[3], s2: names[2])

let reversedNames01 = names.sorted(by: backward)
reversedNames01

let reversedNames02 = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})
reversedNames02

let reversedNames03 = names.sorted(by: {s1, s2 in return s1 > s2 })
reversedNames03

let reversedNames04 = names.sorted(by: {s1, s2 in s1 > s2})
reversedNames04

let reversedNames05 = names.sorted(by: { $0 > $1 })
reversedNames05

let reversedNames06 = names.sorted() { $0 > $1 }
reversedNames06

let reversedNames07 = names.sorted(by: >)
reversedNames07

간단한 퀴즈


글자수가 짧은 순으로 정렬하시오.

// Q. 글자가 짧은 것들을 순으로 문자열 배열을 정렬하시오

let strArr = ["Alex", "Harry", "Uno", "Kay", "zico"]

func shortFirst(_ s1: String, _ s2: String) -> Bool {
    return s1.count < s2.count
}

let shortStrArr01 = strArr.sorted(by: shortFirst)

let shortStrArr02 = strArr.sorted() { $0.count < $1.count}
profile
iOS & Flutter
post-custom-banner

0개의 댓글