Identifiable이란?

2024. 9. 22. 19:09·Category/iOS
728x90

Identifiable은 Swift와 SwiftUI에서 사용하는 프로토콜로, 데이터 객체에 고유한 식별자를 제공하여, 컬렉션 내에서 각 객체를 고유하게 식별할 수 있게 합니다. 특히 리스트, 그리드와 같은 SwiftUI의 동적 뷰 구성에서 데이터 항목을 구분할 때 매우 유용하게 사용됩니다.

1. Identifiable 프로토콜 개념

Identifiable 프로토콜은 객체가 고유한 ID를 가져야 함을 보장합니다. 이 프로토콜을 채택하면 id라는 속성을 제공해야 하며, 이 속성을 통해 객체를 고유하게 식별할 수 있습니다.

protocol Identifiable {
    associatedtype ID: Hashable
    var id: Self.ID { get }
}

2. 사용 목적

  • SwiftUI의 리스트나 ForEach에서 사용: SwiftUI의 List나 ForEach와 같은 뷰는 내부적으로 객체를 식별하여 어떤 항목이 추가되었는지, 삭제되었는지, 업데이트되었는지 알아야 합니다. Identifiable을 채택하면 이러한 식별 작업이 쉬워집니다.
  • 객체 간 고유성 보장: 여러 객체가 존재할 때, 각 객체를 고유하게 구분하기 위해 사용됩니다.

3. 기본 사용법

Identifiable 프로토콜을 채택하려면, 구조체나 클래스에서 고유한 식별자를 제공해야 합니다. 주로 UUID나 숫자 같은 값이 사용됩니다.

예시 1: UUID를 사용한 Identifiable 채택

struct User: Identifiable {
    let id = UUID()  // 고유한 ID
    var name: String
}

위 예시에서 User 구조체는 Identifiable을 채택하고, 각 User 객체는 고유한 UUID를 가지게 됩니다.

예시 2: 특정 필드를 고유 ID로 사용하는 경우

struct Product: Identifiable {
    var id: Int  // 고유한 정수 ID
    var name: String
    var price: Double
}

여기서는 id 필드를 Int 타입으로 선언하여, 각각의 Product가 고유한 정수 식별자를 갖습니다.

4. SwiftUI에서의 사용

SwiftUI에서 동적인 리스트나 ForEach 구문을 사용할 때, 데이터 항목을 고유하게 식별할 수 있어야 합니다. Identifiable을 채택하면 SwiftUI는 각 항목을 쉽게 식별할 수 있습니다.

예시: List와 Identifiable

struct ContentView: View {
    let users = [
        User(name: "Alice"),
        User(name: "Bob"),
        User(name: "Charlie")
    ]
    
    var body: some View {
        List(users) { user in
            Text(user.name)
        }
    }
}
  • User가 Identifiable을 채택했기 때문에, List는 각 User를 고유하게 식별하고 효율적으로 관리할 수 있습니다.
  • 각 항목은 id를 통해 고유하게 구분되므로, SwiftUI는 항목이 추가되거나 삭제될 때 이를 인식하여 적절하게 뷰를 업데이트합니다.

예시: ForEach와 Identifiable

struct ContentView: View {
    let products = [
        Product(id: 1, name: "Laptop", price: 999.99),
        Product(id: 2, name: "Phone", price: 799.99),
        Product(id: 3, name: "Tablet", price: 499.99)
    ]
    
    var body: some View {
        ForEach(products) { product in
            Text("\(product.name): $\(product.price)")
        }
    }
}
  • Product 구조체가 Identifiable을 채택하여, ForEach에서 각 제품을 고유하게 식별하고 화면에 그립니다.

5. Identifiable이 없는 경우

만약 데이터가 Identifiable을 채택하지 않았다면, ForEach나 List에서 고유한 필드를 수동으로 지정해주어야 합니다.

struct ContentView: View {
    let products = [
        Product(id: 1, name: "Laptop", price: 999.99),
        Product(id: 2, name: "Phone", price: 799.99),
        Product(id: 3, name: "Tablet", price: 499.99)
    ]
    
    var body: some View {
        ForEach(products, id: \.id) { product in
            Text("\(product.name): $\(product.price)")
        }
    }
}
  • 여기서 id: \.id는 고유 식별자로 사용할 필드를 명시적으로 지정하는 방법입니다.

6. 요약

  • Identifiable은 SwiftUI에서 객체를 고유하게 식별하기 위한 프로토콜입니다.
  • 객체가 Identifiable을 채택하면, 고유 식별자(id)를 제공해야 합니다.
  • SwiftUI의 List, ForEach 같은 뷰에서 동적 항목을 효율적으로 관리하고, 각 객체를 고유하게 처리할 수 있게 도와줍니다.
  • 고유 식별자는 UUID, 정수, 문자열 등 다양한 값이 될 수 있습니다.

Identifiable을 사용하면 SwiftUI에서 상태 변화를 감지하고 자동으로 UI를 업데이트하는 데 매우 유용하며, 리스트나 데이터 관리가 훨씬 간결해집니다.

728x90

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

Spacer()란?  (0) 2024.09.23
@FocusState란?  (0) 2024.09.23
@EnvironmentObject란?  (0) 2024.09.22
NavigationStack이란?  (1) 2024.09.22
ZStack이란?  (0) 2024.09.22
'Category/iOS' 카테고리의 다른 글
  • Spacer()란?
  • @FocusState란?
  • @EnvironmentObject란?
  • NavigationStack이란?
Corinee
Corinee
  • Corinee
    Coding Note
    Corinee
  • 전체
    오늘
    어제
    • 분류 전체보기 (361) N
      • Category (354)
        • Algorithm (7)
        • SQL (2)
        • Java (4)
        • C (9)
        • React (7)
        • JavaScript (9)
        • CSS (2)
        • Node (1)
        • SpringBoot (26)
        • Database (3)
        • Network (1)
        • Django (6)
        • Python (22)
        • Flask (4)
        • iOS (25)
        • Swift (4)
        • Flutter (11)
        • Dart (3)
        • Git (1)
        • Firebase (1)
        • Gof (1)
        • 정보처리기사 (112)
        • AI (5)
        • NestJs (4)
        • Docker (1)
        • 사이드 프로젝트 (1)
        • Note (80)
        • Socket (1)
        • 개인 정보 처리 방침 (1)
        • 면접 (0)
        • Vue.js (0)
      • Archive (2) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    x.y.z (메이저.마이너.패치)
    원시값(primitive)
    inp
    semver)
    math.h
    named export vs default export
    mcp server
    counter
    stdlib.h
    Collections
    styled-components
    ajax (asynchronous javascript and xml)
    시맨틱 버전(semantic versioning
    intellij 콘솔 한글 깨짐
    useEffect
    public vs assets
    프로세스 강제 종료
    structuredclone()
    react
    core web vitals
    jackson 라이브러리
    react router
    Jest
    소프트웨어 버전 관리
    json.parse(json.stringify())
    쉽게 풀어쓴 C언어 Express
    중첩 함수(nested function)
    chrome extension 자동 배포
    mermaid-cli
    defaultdict
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Corinee
Identifiable이란?
상단으로

티스토리툴바