본문 바로가기
iOS/SwiftUI

Swift Enclosure vs Closure, ViewBuilder?

by HaningYa 2020. 10. 27.
728x90

SwiftUI의 ViewBuilder 를 공부하다 이런 표현이 나왔다. 

(Raywenderlich SwiftUI by tutorials p.386)

This provides a view inside the ForEach loop that you passed in. 
ForEach uses a ViewBuilder to create a parameter for the view-producing enclosure.
You’ll now update the GridView so it can take such an enclosure to define the contents of each cell in the grid.

view-producing enclosure, take such an enclosure to define

등의 표현으로 봤을 때 클로져랑 비슷한 느낌이긴 한데 한영 사전에서 보면 

이렇다. closure 은 close 에 중점을 둬서 끝나는, 종료에 의미를 두어 어떠한 event가 끝나는 느낌이라면

enclosure 는 닫힌, 둘러싸인 enclose 의 느낌이다. 

이걸 배경지식으로 생각하고 다른 enclosure 가 쓰인 다른 문장을 보면

init(columns: Int, items: [Int],
    @ViewBuilder content: @escaping (Int) -> Content) {
  self.columns = columns 
  self.items = items 
  self.content = content
}

This new initializer accepts an enclosure named Content along with the previous number of columns and an array of integers.

이 새로운 생성자는 Content라는 enclosure 를 받아...(생략) 

 

Enclosure vs Closure - What's the difference?

As nouns the difference between enclosure and closure is...

wikidiff.com

As nouns the difference between enclosure and closure

 is that enclosure is (countable) something enclosed, ie inserted into a letter or similar package while closure is an event or occurrence that signifies an ending.

enclosure 는 셀수 있으며 닫힌 무언가이고 closure 는 ending 을 나타내는 event 나 occurrence 를 뜻한다.

Swift 에서 Closure 란

 

오늘의 Swift 상식 (Closure)

클로저(Closure)란?

medium.com

사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호 { } 로 구분된 코드의 블럭이며 일급 객체의 역할을 할 수 있다.

함수는 클로저의 한 형태로 이름이 있는 클로져 이다.

enclosure는 동봉된, 닫힌의 뜻으로 ViewBuilder를 통해 reusable view 를 만들 때, 보여줄 view (cell 같은 view)를 enclosure 동봉해서 전달하는다는? 의미인 것 같다.


ViewBuilder 를 사용해서 reusable view 를 만드려면

struct GridView<Content>: View where Content: View {

GridView에 타입으로 Content 라는 제네릭 타입을 받게 하고 GridView 구조체는 View 프로토콜을 준수하는데

where절을 통해 제네릭인 Content 또한 View 프로토콜을 준수하게 만든다.

 

[Swift]Generics 정리

제네릭(Generics) 제네릭 코드는 유연하게 작성할 수 있고, 재사용가능한 함수와 타입이 어떤 타입과 작업할 수 있도록 요구사항을 정의한다. 중복을 피하고 의도를 명확하게 표현하고, 추상적인

minsone.github.io

그리고 Int를 받아 Content 를 리턴하는 클로져 변수 content 를 만들고

let content: (Int) -> Content

initializer 를 만든다.

init(columns: Int, items: [Int],
  @ViewBuilder content: @escaping (Int) -> Content) {
  self.columns = columns 
  self.items = items 
  self.content = content
}

이 생성자는 Content라는 이름의 enclosure를 받는다. 또한 enclosure가 single Int parameter를 받을 것을 정의한다.

이렇게 생긴 GridView 는 인스턴스 만들때

 GridView(columns: 3, items: [11, 3, 7, 17, 5, 2, 1]) { item in
  Text("\(item)")
}

마지막 Viewbuilder의 content를 enclosure로 받는 것 이다. 

결국 코드에서

{ item in 
	Text("\(item)")
}

이 클로져가 content 변수에 저장되고 이 content 는 "let content : (Int) -> Content" 로 선언한다.

Your loop can then display the enclosure for each element in the grid.

You can use the parameter to pass the current element of the array into the enclosure.

이 두문장에서 보면 enclosure 는 (Int) -> Content 를 의미하는 것 같다.

728x90

'iOS > SwiftUI' 카테고리의 다른 글

#15 Complex Interfaces  (0) 2020.10.27
#14 Animations  (0) 2020.10.27
#16 Testing & Debugging  (0) 2020.10.26
SwiftUI in UIKit vs UIKit in SwiftUI  (0) 2020.10.26
SwiftUI size rendering algorithm  (0) 2020.10.26

댓글