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 를 받아...(생략)
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 란
사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호 { } 로 구분된 코드의 블럭이며 일급 객체의 역할을 할 수 있다.
함수는 클로저의 한 형태로 이름이 있는 클로져 이다.
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 프로토콜을 준수하게 만든다.
그리고 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 를 의미하는 것 같다.
'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 |
댓글