티스토리 뷰
swift의 @escaping 에 대해서 적어볼까 합니다.
개념만 알면 아주 쉬운 개념입니다.
저는 swift4를 사용합니다.
다음과 같이 우리는 function에 closure를 넘겨주어서 사용이 가능합니다.
1 2 3 | func test(block: () -> ()) { block() } | cs |
그렇다면 다음과 같으면 어떨까요?
1 2 3 4 5 | func test(block: () -> ()) { DispatchQueue.main.async { block() } } | cs |
무언가 오류가 납니다.
noescape closure가 탈출하려고 하였다고 합니다.
일반적으로 그냥 선언을 하여 주지 않는다면 @noescape가 적용되는 겁니다.
그래서 적용을 하지 않았다고 나오는거죠.
1 2 3 4 5 | func test(block: @noescape () -> ()) { DispatchQueue.main.async { block() } } | cs |
이렇게 하면 위아래로 에러가 발생합니다. 아래의 아래는 block에 대한 에러고 위는 @noescape의 에러입니다.
기본으로 @noescape가 들어가 있고, 삭제 되었으니 그냥 넣지 말라는 뜻입니다.
그럼 최종적으로는 이렇게 하면 됩니다.
1 2 3 4 5 | func test(block: @escaping () -> ()) { DispatchQueue.main.async { block() } } | cs |
closure 자체가 escaping 될수 있다는것을 선언하여 줍니다.
이유를 따지자면 function에서 다른 function을 호출하였는데, 자신의 function안에서 살아 있다가 없어져 버리기 때문입니다.
좀 어렵게 적은거 같지만 세번정도 보시면 말이 이해가 되실겁니다. ㅠ 더 쉽게 적을수 있으면 적어볼게요.
* noescape -> noescape 가능. noescape -> escaping 불가. escaping -> escaping, noescaping 모두 가능
@autoclosure
1 2 3 4 5 6 7 8 9 10 11 12 13 | func test(block: () -> ()) { block() } test { print("AAA") } func test2(block: @autoclosure () -> ()) { block() } test2(block: print("BBB")) | cs |
위의 function과 아래의 function의 차이를 느끼실수 있을까요?
1 | test { print("AAA") } | cs |
test를 이렇게 호출해도 되겠지만 뭔가 좀 어색하긴 하네요.
차이는 블럭에 들어가는 일반적인 함수 호출등을 그냥 closure처럼 취급한다는 것입니다.
조금은 더 짧게 구현이 가능하겠죠?
'Mobile > iOS' 카테고리의 다른 글
iOS. Custom View 만들기 (0) | 2018.08.14 |
---|---|
Swift. AVPlayer 이용하기 (0) | 2018.07.08 |
Swift. inline function (0) | 2018.07.06 |
iOS. Core Data 간략히 설명 (0) | 2018.06.30 |
Swift. 접근 한정자 (0) | 2018.06.25 |
- Total
- Today
- Yesterday
- ubuntu
- Xcode
- Codable
- docker
- MySQL
- Gradle
- ios
- android
- Java
- go
- SWIFT
- Python
- Kotlin
- nodejs
- Linux
- Windows
- git
- enum
- Spring
- CentOS
- windows10
- war
- cocoapods
- centos8
- rxswift
- tomcat
- github
- php
- intellij
- golang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |