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