[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/SwiftUI

[SwiftUI] ForEach, Identifiable

inu 2022. 3. 30. 12:04
반응형

본 게시글은 애플의 공식문서(https://developer.apple.com/documentation/swiftui/foreach)를 참고하여 작성되었습니다.

ForEach

확인된 데이터의 기본 collection으로부터 계산된 view들을 만들 수 있는 구조체입니다.

  • View Builder에는 for문을 적용할 수 없습니다. 대신 ForEach문을 사용합니다.
  • 배열을 이용해 새로운 Bag of Views를 만들 수 있습니다.
  • 단, collection의 요소는 Identifiable protocol을 채택해야 합니다.
    • 배열은 요소들이 계속해서 추가 및 삭제되면서 순서가 바뀔 수 있습니다.
    • 따라서 각 요소들이 고유한 identifier가 있어야 해당 요소로 만들어진 View를 확인할 수 있습니다.
    • 만약 단순 문자열을 사용하고 싶을 경우, 별다른 고유 id가 없기 때문에 \.self를 통해 구분합니다. 물론 이렇게되면 같은 문자열을 사용한 View는 같은 View로 인식되어 작동하게 됩니다. (수정처리시 동시적용)
  • 아래 예시는 ForEach를 통해 View를 생성하는 예시입니다. NamedFont가 Indentifiable를 채택하고 있기 때문에 활용이 가능합니다.
private struct NamedFont: Identifiable {
    let name: String
    let font: Font
    var id: String { name }
}

private let namedFonts: [NamedFont] = [
    NamedFont(name: "Large Title", font: .largeTitle),
    NamedFont(name: "Title", font: .title),
    NamedFont(name: "Headline", font: .headline),
    NamedFont(name: "Body", font: .body),
    NamedFont(name: "Caption", font: .caption)
]

var body: some View {
    ForEach(namedFonts) { namedFont in
        Text(namedFont.name)
            .font(namedFont.font)
    }
}
  • 결과

Identifiable

인스턴스가 안정적으로 구분될 수 있는 엔티티 값을 가지도록하는 타입의 클래스입니다.

  • Identifiable protocol을 사용하면 클래스 혹은 값 타입에 안정적인 구분개념(ID)을 가지도록 할 수 있습니다. 예를 들어 앱이나 앱의 저장소에서 안정적인 ID 속성을 기반으로 사용자 유형을 정의할 수도 있습니다. 사용자 이름과 같은 다른 데이터 필드가 변경되어도 ID 속성을 기반으로 특정 사용자를 식별할 수 있습니다.
  • ID는 다음과 같은 속성을 가집니다.
    • UUID와 같이 항상 고유함을 보장합니다.
    • 데이터베이스 레코드 키와 같이 각 환경별로 영구적으로 고유합니다.
    • object identifier와 같이 개체의 수명 동안 고유합니다.
    • 컬렉션 인덱스와 같이 현재 컬렉션 내에서 고유합니다.
반응형