Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[SwiftUI] EqutableView (feat. POD) ๋ณธ๋ฌธ

apple/๐Ÿš SwiftUI & Combine

[SwiftUI] EqutableView (feat. POD)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2023. 8. 8. 21:59

- EqutableView๋ž€?
> EqutableView๋Š” ์ด์ „ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ƒˆ ๊ฐ’์ด ์ด์ „ ๊ฐ’๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ ์ž์‹ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋ทฐ์ž…๋‹ˆ๋‹ค.

 

`iOS 13.0+` `iPadOS 13.0+` `tvOS 13.0` `watchOS 6.0+` `visionOS 1.0+ Beta

 

[apple-docs-EqutableView](https://developer.apple.com/documentation/swiftui/equatableview)

 

๐Ÿ’ก ๋“ค์–ด๊ฐ€๊ธฐ ์ „.


- ์•„๋ž˜์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ง€์‹์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•จ. ํ•„์š”ํ•œ ์ด์œ ๋Š” ๊ธ€ ์ œ์ผ ์•„๋ž˜์—์„œ ์„ค๋ช…
   - [Plain ol' Data](https://rldd.tistory.com/551)

 

 

EqutableView Usage


1. ๋‚ด๊ฐ€ EqutableView๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ณณ์— Equtable์„ ์ฑ„ํƒ

struct LuckyBoxStateView: View, Equtable { ... }

 

2. ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ

Equtable(content: LuckyBoxStateView(text: text))

or

/// โœ… ์š” ๋ฐฉ์‹์ด ์„ ์–ธ์ ์ด๋ผ ๋” ๋‚˜์Œ
LuckyBoxStateView(text: text)
    .equtable()

 

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค


- ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ์„œ๋น„์Šค์— ํ™•๋ฅ ํ˜• ์•„์ดํ…œ์ธ ๋Ÿญํ‚ค๋ฐ•์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •.
- ๋Ÿญํ‚ค๋ฐ•์Šค๋ฅผ ๊ตฌ๋งค์‹œ ํŠน์ • ํ™•๋ฅ ์— ๋”ฐ๋ผ ๋ฐฐ์ˆ˜๊ฐ€ ๊ฒฐ์ •.
- ๋Ÿญํ‚ค๋ฐ•์Šค ์˜คํ”ˆ์‹œ ๊ฒฐ์ •๋œ ๋ฐฐ์ˆ˜๊ฐ€ UI์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ฐฉ์‹.

 

 

โœ… Code Smaple

import SwiftUI

enum LuckyBoxState: String {
    case state1 = "x10๋ฐฐ"
    case state2 = "x2๋ฐฐ"
    case state3 = "x0.5๋ฐฐ"
    case state4 = "x0.1๋ฐฐ"
    
    static func result(number: Double) -> String {
        if number < 5 {
            return LuckyBoxState.state1.rawValue
        } else if number < 15 {
            return LuckyBoxState.state2.rawValue
        } else if number < 45 {
            return LuckyBoxState.state3.rawValue
        } else {
            return LuckyBoxState.state4.rawValue
        }
    }
}

struct ContentView: View {
    @State private var number: Double = 0
    @State private var count: UInt = 0
    
    private let size: CGFloat = 200
    
    var body: some View {
        print("count: \(count) | number: \(number)")
        
        return VStack {
            LuckyBoxStateView(text: LuckyBoxState.result(number: number))
                .equatable()
                .frame(width: size, height: size * 2 / 3, alignment: .center)
                .background(.blue.opacity(0.5))
                .cornerRadius(10)
            
            Button {
                number = Double.random(in: 0..<100)
                count += 1
            } label: {
                Text("๋Ÿญํ‚ค๋ฐ•์Šค ์˜คํ”ˆ")
            }

            Text("๋‹น์ฒจ๋ฒˆํ˜ธ: \(number)")
            Text("์˜คํ”ˆ์ฐจ์ˆ˜: \(count)")
        }
    }
}



struct LuckyBoxStateView: View, Equatable {
    var text: String
    
    static func == (lhs: LuckyBoxStateView, rhs: LuckyBoxStateView) -> Bool {
        
        return lhs.text == rhs.text
    }
    
    
    var body: some View {
        print("init")
        
        return VStack(alignment: .center) {
            Text("๐ŸŽŠ ๋‹น์ฒจ ๐ŸŽŠ")
            
            Spacer()
                .frame(height: 20)
            
            Text(text)
                .font(.system(size: 40, weight: .semibold))
        }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

- ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ

์ œ๋Œ€๋กœ ์ ์šฉ ๋œ ์ผ€์ด์Šค

๋ณด๋‹ค์‹œํ”ผ ๊ฐ’์ด ๋™์ผํ•  ๊ฒฝ์šฐ init์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ.

 

๐Ÿšจ ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์  ๐Ÿšจ

์ด๊ฑฐ ์ง„์งœ ์ค‘์š”ํ•จ. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” EqutableView๋กœ ๋งŒ๋“ค์–ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์กด์žฌ.

 

- ๋งŒ์•ฝ LuckyBoxStateView์— member๊ฐ€ POD ํƒ€์ž…๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ์šฐ์—๋Š” EqutableView์ž„์—๋„ ํ•ด๋‹น `static func ==`์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  LuckyBoxStateView์˜ init์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


- non-POD๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ถ€๋ถ„์€ `static func ==`์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ @State์™€ @Biding์˜ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€์—์„œ ์ž์ฒด์ ์œผ๋กœ `static func ==`์„ ๊ฒฐ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

(์ฐธ๊ณ )

https://ios-development.tistory.com/1111

https://velog.io/@doldamul/SwiftUI-Modifier-equatable

https://swiftui-lab.com/equatableview/

Comments