Ios 核心数据不支持自定义类型吗?我应该用什么来储存货币?

Ios 核心数据不支持自定义类型吗?我应该用什么来储存货币?,ios,swift,swiftui,Ios,Swift,Swiftui,我正在使用,并且有一个可识别的模型,其中一个字段是“var price:USD”(USD类型的价格变量(从库中)。我注意到,如果我想使用coredata,没有可供我使用的“USD”类型。有没有一种方法可以将此类型与核心数据一起使用?或者使用不同的(现成的)类型是更好的做法用于存储货币的类型(例如swiftui/swift中的$5.08数据) 不管这种类型是什么,我在对这种类型进行转换时一直在做什么(比如说我需要在“价格”的值上加上5美元),我通常是这样做的:美元(5.08)+美元(5)。因此,不

我正在使用,并且有一个可识别的模型,其中一个字段是“var price:USD”(USD类型的价格变量(从库中)。我注意到,如果我想使用coredata,没有可供我使用的“USD”类型。有没有一种方法可以将此类型与核心数据一起使用?或者使用不同的(现成的)类型是更好的做法用于存储货币的类型(例如swiftui/swift中的$5.08数据)


不管这种类型是什么,我在对这种类型进行转换时一直在做什么(比如说我需要在“价格”的值上加上5美元),我通常是这样做的:美元(5.08)+美元(5)。因此,不断地从coredata中提取值,并将其放入美元(……)中,似乎是件麻烦事在执行任何转换之前,请将其转换回CoreData支持的任何类型。尽管这是最佳做法,但我对此没有意见。

您可以支持自定义类型。您需要一个符合
NSSecureCoding
NSObject

此外,您需要一个符合
NSSecureUnarchiveFromDataTransformer

然后在CoreData中将属性
类型设置为
可转换的
,将
转换器设置为
YourClassTransformer
自定义类设置为
=
YourClass

@objc(USD)
public class USD: NSObject {
    var value: Double
    
    public enum CodingKeys: String, CodingKey {
        case value
    }
    public init(value: Double) {
        self.value = value
    }
    public required init?(coder: NSCoder) {
        value = coder.decodeObject(forKey: CodingKeys.value.rawValue) as! Double
    }
    
    public override var description: String{
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = Locale(identifier: "en_US")
        return formatter.string(from: NSNumber(value: value))! 
    }
}
extension USD: NSSecureCoding{
    public static var supportsSecureCoding: Bool{
        return true
    }
    public func encode(with coder: NSCoder) {
        coder.encode(value, forKey: CodingKeys.value.rawValue)
    }
}
@objc(USDTransformer)
public final class USDTransformer: NSSecureUnarchiveFromDataTransformer {
    public static let name = NSValueTransformerName(rawValue: String(describing: USDTransformer.self))
    public override static var allowedTopLevelClasses: [AnyClass] {
        return [USD.self]
    }
    //Register before CoreData setup starts
    public static func register() {
        
        let transformer = USDTransformer()
        ValueTransformer.setValueTransformer(transformer, forName: name)
    }
}

您可以支持自定义类型。您需要符合
NSSecureCoding
NSObject

此外,您需要一个符合
NSSecureUnarchiveFromDataTransformer

然后在CoreData中将属性
类型设置为
可转换的
,将
转换器设置为
YourClassTransformer
自定义类设置为
=
YourClass

@objc(USD)
public class USD: NSObject {
    var value: Double
    
    public enum CodingKeys: String, CodingKey {
        case value
    }
    public init(value: Double) {
        self.value = value
    }
    public required init?(coder: NSCoder) {
        value = coder.decodeObject(forKey: CodingKeys.value.rawValue) as! Double
    }
    
    public override var description: String{
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = Locale(identifier: "en_US")
        return formatter.string(from: NSNumber(value: value))! 
    }
}
extension USD: NSSecureCoding{
    public static var supportsSecureCoding: Bool{
        return true
    }
    public func encode(with coder: NSCoder) {
        coder.encode(value, forKey: CodingKeys.value.rawValue)
    }
}
@objc(USDTransformer)
public final class USDTransformer: NSSecureUnarchiveFromDataTransformer {
    public static let name = NSValueTransformerName(rawValue: String(describing: USDTransformer.self))
    public override static var allowedTopLevelClasses: [AnyClass] {
        return [USD.self]
    }
    //Register before CoreData setup starts
    public static func register() {
        
        let transformer = USDTransformer()
        ValueTransformer.setValueTransformer(transformer, forName: name)
    }
}

你可以用一个你可以用一个谢谢你的答案。出于好奇,这…是理想的吗?或者考虑到我的情况,因为我试图处理金钱,我应该坚持一种开箱即用的类型?对于一个
Double var
和一个
description
显示$,需要做大量的工作。我实际上是把e代码只是为了“好玩”如果你给我一点时间,我会发布它。我在上面添加了代码。谢谢,所以尽管这显然是可能的…也许最好还是坚持使用double for coredata价格类型?谢谢你的代码,这真的有助于清楚地说明如何做到这一点。可能,我很难想象一个场景是持久性工作值得的。它是你必须是一个金钱密集型应用,包括其他属性,如转换器、方程,以查看未来价值等。谢谢你的回答。纯粹出于好奇,这……是理想的吗?或者考虑到我的情况,因为我试图处理金钱,我应该坚持一种开箱即用的类型?这对
来说是一个很大的工作uble var
和显示$的
说明。实际上,我把代码放在一起只是为了“好玩”如果你给我一点时间,我会发布它。我在上面添加了代码。谢谢,所以尽管这显然是可能的…也许最好还是坚持使用double for coredata价格类型?谢谢你的代码,这真的有助于清楚地说明如何做到这一点。可能,我很难想象一个场景是持久性工作值得的。它是ould必须是一款金钱至上的应用程序,包括其他属性,如转换器、方程式以查看未来价值等。