Json 在标签中指定双精度文本时,如何删除单词optional?

Json 在标签中指定双精度文本时,如何删除单词optional?,json,swift,Json,Swift,我从JSON中得到一系列值,其中一个由totalBuy定义,这个值被定义为bool struct PurchaseTotals: Codable { var totalBuy: Double? enum CodingKeys: String, CodingKey { case sumTotal = "totalBuy" } } 当我尝试为标签指定此双精度文本时,单词optional出现在前面: 我是这样赋值的: sumLabel.text

我从JSON中得到一系列值,其中一个由totalBuy定义,这个值被定义为bool

struct PurchaseTotals: Codable {

    var totalBuy: Double?

    enum CodingKeys: String, CodingKey {

        case sumTotal = "totalBuy"
    }
}
当我尝试为标签指定此双精度文本时,单词optional出现在前面:

我是这样赋值的:

    sumLabel.text = "\(totalBuy)"
如何删除“可选”一词


除此之外,是否可以在必要时将标签内的值格式化为包含逗号,totalBuy的值有时可能看起来像1000,其中在1000之后需要逗号

我想你要找的是

首先,枚举编码键中的可编码案例名称必须与可编码类型中的属性完全匹配

所以,看起来应该是

struct PurchaseTotals: Codable {
    var sumTotal: Double?
    enum CodingKeys: String, CodingKey {
        case sumTotal = "totalBuy"
    }
}
在上面的代码中,sumTotal是属性名,totalBuy是必须从API获取的键。如果相反,您可以相应地更改代码

问题1 现在,由于sumTotal是可选的,这就是为什么要在标签中打印可选内容

在使用之前,您需要先打开sumTotal

问题2 现在,由于需要在使用sumTotal之前对其进行格式化,因此可以在PurchaseTotals本身中创建一个变量,该变量将返回formattedSumTotal字符串

所以,组合的代码是这样的

struct PurchaseTotals: Codable {
    var sumTotal: Double?
    enum CodingKeys: String, CodingKey {
        case sumTotal = "totalBuy"
    }

    lazy var formattedSumTotal: String? =  {
        if let sumTotal = sumTotal {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            let str = formatter.string(from: NSNumber(value: sumTotal))
            return str
        }
        return nil
    }()
}
使用格式化的SumTotal,如下所示:


这里的问题是totalBuy是否真的应该是可选的。您应该将其声明为常量和非可选。顺便说一句,你的代码不会编译。CodingKeys枚举是无意义的结构PurchaseTotals:Codable{let totalBuy:Double}当我将formattedSumTotal分配给标签时,我得到错误:实例成员“formattedSumTotal”不能用于类型“PurchaseTotals”PurchaseTotals是PurchaseTotals类型的对象。在代码中,查看对象的名称,并在该对象上使用formattedSumTotal。正确,对象名称写在单词struct right之后?否。这是您创建的类型。您必须已经创建了该类型的对象,对吗?在您的示例中,您在哪里定义purchaseTotals?
struct PurchaseTotals: Codable {
    var sumTotal: Double?
    enum CodingKeys: String, CodingKey {
        case sumTotal = "totalBuy"
    }

    lazy var formattedSumTotal: String? =  {
        if let sumTotal = sumTotal {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            let str = formatter.string(from: NSNumber(value: sumTotal))
            return str
        }
        return nil
    }()
}
label.text = purchaseTotals.formattedSumTotal