Swift动态变量名称取决于值

时间:2018-09-05 11:00:45

标签: ios swift

我有一个这样的变量名列表(BankHelper.swift):

static var va_1_atm =
"""
<ol>
    <li>Silahkan kunjungi ATM terdekat</li>
    <li>Pilih Menu <strong>Transaksi Lain</strong></li>
    <li>Pilih <strong>Pembayaran</strong></li>
    <li>Pilih <strong>Lain-lain</strong></li>
    <li>Pilih <strong>BRIVA</strong></li>
    <li>Masukkan Nomor Virtual Account, <strong>\(virtual_account)</strong></li>
    <li>Pilih <strong>Ya</strong></li>
    <li>Ambil bukti bayar Anda, selesai</li>
</ol>
"""

static var va_2_atm =
"""
<ol>
    <li>Silahkan kunjungi ATM terdekat</li>
    <li>Pilih Menu <strong>Transaksi Lain</strong></li>
    <li>Pilih <strong>Pembayaran</strong></li>
    <li>Pilih <strong>Lain-lain</strong></li>
    <li>Pilih <strong>BRIVA</strong></li>
    <li>Masukkan Nomor Virtual Account, <strong>\(virtual_account)</strong></li>
    <li>Pilih <strong>Ya</strong></li>
    <li>Ambil bukti bayar Anda, selesai</li>
</ol>
"""

static var va_3_atm =
"""
<ol>
    <li>Silahkan kunjungi ATM terdekat</li>
    <li>Pilih Menu <strong>Transaksi Lain</strong></li>
    <li>Pilih <strong>Pembayaran</strong></li>
    <li>Pilih <strong>Lain-lain</strong></li>
    <li>Pilih <strong>BRIVA</strong></li>
    <li>Masukkan Nomor Virtual Account, <strong>\(virtual_account)</strong></li>
    <li>Pilih <strong>Ya</strong></li>
    <li>Ambil bukti bayar Anda, selesai</li>
</ol>
"""

我有这样的价值数据:

ReservationModel.bankAccount = 1

问题是如何使用上面的值动态更改上面列表的变量名称,我可以这样尝试:

cell.bankDesc.text = BankHelper.va_+(ReservationModel.bankAccount)+_atm.htmlToString

,但是在Swift中不起作用。我该如何实现这样的目标? ,因此,更改值后,它会动态更改为列表数据。

2 个答案:

答案 0 :(得分:2)

阵列解决方案

使用连续的整数值,可以使它们成为Array的索引。

class BankHelper {
    static var va_1_atm = "<a>les gorilles</a>"
    static var va_2_atm = "<div>in comedy</div>"
    static var va_3_atm = "<marquee>die sad</marquee>"

    fileprivate static var all = [va_1_atm, va_2_atm, va_3_atm]

    static func string(for bankAccount: Int) -> String? {
        return all[bankAccount - 1]
    }
}

用法:

cell.bankDesc.text = BankHelper.string(for: ReservationModel.bankAccount)!.htmlToString

字典解决方案

对于不连续的值,您可以将它们设置为Dictionary的键。

class BankHelper {
    static var va_1_atm = "<a>les gorilles</a>"
    static var va_2_atm = "<div>in comedy</div>"
    static var va_3_atm = "<marquee>die sad</marquee>"

    fileprivate static var all = [1: va_1_atm, 2: va_2_atm, 3: va_3_atm]

    static func string(for bankAccount: Int) -> String? {
        return all[bankAccount]
    }
}

用法:

cell.bankDesc.text = BankHelper.string(for: ReservationModel.bankAccount)!.htmlToString

使用镜像解决方案

或者,您可以使用镜像按名称检索实例变量(这意味着您的变量不能为static才能起作用),但是您可以考虑使用单例模式。

class BankHelper {
    var va_1_atm = "<a>les gorilles</a>"
    var va_2_atm = "<div>in comedy</div>"
    var va_3_atm = "<marquee>die sad</marquee>"

    func string(for bankAccount: Int) -> String? {
        return Mirror(reflecting: self).descendant("va_\(bankAccount)_atm") as? String
    }
}

用法:

cell.bankDesc.text = BankHelper().string(for: ReservationModel.bankAccount)!.htmlToString

使用NSObject解决方案

您需要任意访问静态变量?通过遵守NSObject来使用Objective-C层。

class BankHelper: NSObject {
    @objc static var va_1_atm = "<a>les gorilles</a>"
    @objc static var va_2_atm = "<div>in comedy</div>"
    @objc static var va_3_atm = "<marquee>die sad</marquee>"

    static func string(for bankAccount: Int) -> String? {
        return value(forKey: "va_\(bankAccount)_atm") as? String
    }
}

用法:

cell.bankDesc.text = BankHelper.string(for: ReservationModel.bankAccount)!.htmlToString

答案 1 :(得分:1)

为什么3个不同的变量

static var va_1_atm
static var va_2_atm
static var va_3_atm

当我们可以在此处使用array并使用ReservationModel.bankAccount的值到达index的{​​{1}}以获得适当的文本时。

  

但是,如果您想以这种方式做

可以做的是,将所有变量存储在数组中。您在该数组中存储的变量的索引将与您尝试在变量名称中包括的索引值相对应。

array

然后,只要您有var atms = [typeOfAtmVarHere]() 个与基于var中的va_ 1 _atm的索引匹配的索引,就继续添加此数组。

最后遍历它,并以static var va_1_atm为基础,从arrayReservationModel.bankAccount