Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Swift中的字符串属性访问复杂的枚举项?_Swift_Enums_Accessor - Fatal编程技术网

如何通过Swift中的字符串属性访问复杂的枚举项?

如何通过Swift中的字符串属性访问复杂的枚举项?,swift,enums,accessor,Swift,Enums,Accessor,来自开源项目github.com/Flight-School/Money 货币声明如下所示: 货币.swift 还有一个货币结构。斯威夫特这样说: public-struct-Money:equalable,Hashable{ ///钱的数量。 公共风险值金额:十进制 ///创建具有给定十进制数的金额。 公共初始(金额:十进制){ self.amount=金额 } ///货币类型。 公共变量货币:CurrencyType.Type{ 返回货币.self } /** 四舍五入的货币数额 次要货币单

来自开源项目github.com/Flight-School/Money 货币声明如下所示:

货币.swift

还有一个货币结构。斯威夫特这样说:

public-struct-Money:equalable,Hashable{
///钱的数量。
公共风险值金额:十进制
///创建具有给定十进制数的金额。
公共初始(金额:十进制){
self.amount=金额
}
///货币类型。
公共变量货币:CurrencyType.Type{
返回货币.self
}
/**
四舍五入的货币数额
次要货币单位的位数。
*/
公众:金钱{
退货金额(金额.四舍五入(适用于:Currency.self))
}
}
//马克:可比
扩展资金:可比{
公共静态函数<(左:货币,右:货币)->Bool{
返回左侧金额<右侧金额
}
}
用法示例:

let amount = Decimal(12)
let monetaryAmount = Money<USD>(amount) // Works with any hard-coded currency code
let amount=Decimal(12)
让monetaryAmount=Money(amount)//与任何硬编码的货币代码一起工作
我的问题代码:

let amount = Decimal(12)
let monetaryAmount = Money<USD>(amount) // Works with any hard-coded currency code
我试图实现的是通过字符串输入,用用户选择的CurrencyType构造一个money对象:

let userCurrencyCodeInput = "USD"
let userAmountInput = 39.95

let currency = CurrencyType(code: userCurrencyCodeInput ) // 'CurrencyType' cannot be constructed because it has no accessible initializers
let priceForUser = Money<currency>(userAmountInput) // Use of undeclared type 'currency'
让userCurrencyCodeInput=“USD”
让userAmountInput=39.95
无法构造let currency=CurrencyType(代码:userCurrencyCodeInput)/“CurrencyType”,因为它没有可访问的初始值设定项
让priceForUser=Money(userAmountInput)//使用未声明的类型“currency”

我知道,为了获得相应的CurrencyType枚举项,我可以使用switch case语句,但有150多种货币是用上述方法定义的(这意味着我必须静态地编写150多种货币),因此,如果有一种将字符串代码映射到枚举项的code属性并访问它的动态方法,我最好学习并使用它,否则只需删除整个库并以更通用的方式重新开始实现。

不需要这么多枚举。我想你得到的是你是否可以根据
字符串
输入从
CurrencyType
接收数据。下面是一个大大减少代码大小和复杂性的尝试


货币类型 在这里,我创建了一个名为
CurrencyTypes
的枚举。请注意,我已将其与
String
caseitrable
一致

对于每种货币类型的情况,我都会指定一个字符串原始值

例如,我创建了
USD
案例。请注意,我是如何将其所有数据放入一个字符串中的:
“USD.US Dollar.2”
。我把每一条信息用句号隔开。代码、名称和次要单位。如果要提取此数据,请使用
raw
方法,它将返回
(code:String,name:String,minorUnit:Int)

最后,我创建了一个新的初始化方法。它允许您根据其
代码
或其
名称
初始化货币类型。如果我想兑换美元,您可以执行以下任一操作:

  • 让currencyType=currencyType(“USD”)
  • 让currencyType=currencyType(“美元”)
这使我们可以轻松地创建许多新的货币对象。如果您想引入另一种货币,您所要做的就是添加另一个案例(而不是创建一个全新的枚举)

enum CurrencyType:字符串,可大小写{
案例EUR=“EUR.EUR.2”
案例GBP=“英镑.2”
案例USD=“USD.US.2”
//根据您的喜好添加数百个案例
///检索指定货币类型的**代码**、**名称**、和**辅单位**
var raw:(代码:String,名称:String,minorUnit:Int){
让values=self.rawValue.split(分隔符:“.”.map{String($0)}
返回(值[0]、值[1]、Int(值[2])!)
}
///根据**代码**或**名称查找货币**
初始化?(uu-from:String){
对于我来说,在CurrencyType.allCases中{
let(代码、名称)=i.raw
if code==from | | name==from{self=i;return}
}
归零
}
}


本例中如何省钱枚举根本不用作枚举,它们没有任何
大小写
定义,它们只是用来代替结构(
struct
)来存储一些
公共静态变量
。为什么?我认为开发它的人混淆了将枚举用于常量而不是结构的情况(例如,此处讨论:),尽管我不同意@KirilS。关于作者的理解能力(Mattt是最著名的iOS开发者之一),我同意选择单独的枚举真的很奇怪。如果您仍然想使用这个库(否则这是一个经过深思熟虑的项目),您可以将其分叉并稍作更改(使用货币解析csv并生成样板代码的库)我也研究并尝试使用这个项目,但也遇到了类似的问题,因为我使用了核心数据,并且在将持久数据转换为货币时遇到了很多麻烦。我最终使用了(几乎)相同的货币实现,但却为货币创建了一个结构。@JoakimDanielson我的想法为我指明了与您描述的方向相同的方向。
let userCurrencyCodeInput = "USD"
let userAmountInput = 39.95

let currency = CurrencyType(code: userCurrencyCodeInput ) // 'CurrencyType' cannot be constructed because it has no accessible initializers
let priceForUser = Money<currency>(userAmountInput) // Use of undeclared type 'currency'