본문 바로가기

Tech/SwiftUI

iOS app 만들기 #2 Swift Closure

 MVVM에서 헤롱거리고 있을 때 나를 가장 힘들게 한것은 Swift Closure이다. Closure를 이용하면 보다 아름다운 코드를 짤 수 있다. 하지만 반대로 나와 같은 초보자들 (특히 GUI에 익숙하지 않은) 은 왜 이 코드가 작동하는지 이해하기 힘들어 한다는 것이다.  가장 당황스러운건 그냥 List에 Text를 써 넣기만하면 툭툭 작동하는 것인가 이다.

var body: some View {
    List(){
        Text("a")
        Text("b")
    }
}

작동하는거야 그냥 넘어가지만 문제는 왜 작동하는지 모르면 작동이 안될때 어떻게 고쳐야하는지 알수 없다.

 

바로 다음과 같은 코드를 넣고싶을 때다.

for x in deck {
    Text(x)
}

deck은 Array로 되어있는 String들일때 List 처럼 작동될거라고 생각했다.

Closure containing control flow statement cannot be used with result builder 'ViewBuilder'

읽어보면 for와 같은 control flow는 안된다는 것이다. (if는 else는 가능!)

 

이를 해결하려면 ForEach( foreach 가 아님! 대문자 ForEach!) 를 이용한다. 설명은 이곳을 참고하자

 

SwiftUI : ForEach

ForEach 대해 알아보도록 합시다. ForEach Declaration (선언) struct ForEach where Data : RandomAccessCollection, ID : Hashable ForEach(array, id: \.self) name in Overview (개요) 일반적으로 ForEach 를..

seons-dev.tistory.com

 

돌아와서 코드는 이렇게 변해야한다는 것이다.

ForEach(deck)
{
    x in Text(x)
}

위의 글을 읽고나면 Hashable, id개념을 조금이나마 이해하면서 넘어가지만

여전히 완벽하게 이해는 안된다. (보통 foreach(x in deck)이 아닌가!?)

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public struct ForEach<Data, ID, Content> where Data : RandomAccessCollection, ID : Hashable {

    /// The collection of underlying identified data that SwiftUI uses to create
    /// views dynamically.
    public var data: Data

    /// A function to create content on demand using the underlying data.
    public var content: (Data.Element) -> Content
}

Swift 문법이 눈에 익어야한다.

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

iOS app 만들기 #1 MVVM  (0) 2021.10.03