[SwifUI] Color를 Coredata에 저장하기

조영훈·2022년 7월 24일
0

coredata에는 color 객체를 저장하기 위한 type이 제공되지 않는다.
그래서 color 정보를 coredata에 저장하기 위해서는 color를 r,g,b,a 로 분해 후에 각가 저장하는 방법 이 있따.

coredata에 attributes를 만들때, Type을 Double로 설정한다.
그리고 color 객체에서 rgba 요소를 분해하기 위해서 아래의 코드를 추가한다.

import swiftUI

#if canImport(UIKit)
import UIKit
#elseif canImport(AppKit)
import AppKit
#endif

extension Color {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, opacity: CGFloat) {

        #if canImport(UIKit)
        typealias NativeColor = UIColor
        #elseif canImport(AppKit)
        typealias NativeColor = NSColor
        #endif

        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var o: CGFloat = 0

        guard NativeColor(self).getRed(&r, green: &g, blue: &b, alpha: &o) else {
            // You can handle the failure here as you want
            return (0, 0, 0, 0)
        }

        return (r, g, b, o)
    }
}

위의 코드의 사용법은 아래와 같다.

Color.red.components.red // 0.9999999403953552

coredata에 추가하기 위해서 사용한 예제는 아래와 같다.

func addTag(color: Color, name: String) {
    let newItem = TagEntity(context: manager.context)
    newItem.id = UUID()
    newItem.name = name
    newItem.timestamp = Date()
    
    newItem.r = color.components.red
    newItem.g = color.components.green
    newItem.b = color.components.blue
    newItem.a = color.components.opacity
    
    save()
 }

참고
stackoverflow

0개의 댓글