首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >复杂字典获得条件为字符串的值

复杂字典获得条件为字符串的值
EN

Stack Overflow用户
提问于 2022-08-21 18:02:27
回答 1查看 46关注 0票数 1

我已经使用laanlabs/SwiftSurvey调查构建了一项调查,并且我能够作为字典从surveyComplete方法中获得结果。

结果以一个复杂的结构返回,我需要通过questions数组-> question对象的键->来获取每个响应的值。这个对象包含一个choices数组,在每个选择对象中都有一个selected键。如果所选键的值为true (1),则需要获取位于同一对象中的text键的值。其中一些选项将有多个selected键,值为true (1),如果是这样的话,我希望在值之间用逗号连接text键值。

然后将密钥插入到SQLite数据库中。

我刚开始对字典进行解码并以正确的方式遍历它们,我可以访问字典print(dictionary),也可以进入正确的NSArray - print(dictionary["questions"],但是从那里我很困惑,有人能告诉我怎么做吗?

结果如下,不幸的是,这是一个很大的块道歉。

代码语言:javascript
代码运行次数:0
运行
复制
[
    "version": 001, 
    "metadata": 
    {
        "app_version" = "1.1";
        build = 22;
        debug = true;
    }, 
    "questions": <__NSArrayI 0x600000614d20>(
        {
            question =     {
                allowsMultipleSelection = 0;
                choices =         (
                                {
                        allowsCustomTextEntry = 0;
                        selected = 1;
                        text = Physician;
                        uuid = "224E1B76-D220-4068-AA22-6861E5F836CB";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = Dietitian;
                        uuid = "2DB2B6FB-E344-4BBF-A551-2FABE0DFF6AA";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = "Genetic Counsellor";
                        uuid = "A9BE7093-B95C-4BF4-B629-12FDA3154ABE";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = "Nurse/Nurse Practitioner/Physician Assistant";
                        uuid = "8E75A41B-0D8C-4ADA-A31C-2BC408F8269D";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = "Pharmacist / Pharmaceutical Industry";
                        uuid = "C943430D-EA48-4BCB-8ADF-011A223BDF36";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = "Academic/Researcher";
                        uuid = "E28377A4-37FC-4351-A857-88383A3D5A3B";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = "Patient/Patient Advocacy Group";
                        uuid = "E5836187-6C08-4272-A88E-40578F4FCF44";
                    },
                                {
                        allowsCustomTextEntry = 1;
                        selected = 0;
                        text = "Other (please specify)";
                        uuid = "EFF22342-48A9-4B8E-81A0-BB44D0E86EBC";
                    }
                );
                required = 1;
                tag = "hcp-specialty";
                title = "Please select the option that best describes your specialty:";
                uuid = "7F77E248-8429-463E-9291-241B94BEE4F8";
            };
            type = 0;
        },
        {
            question =     {
                autoAdvanceOnChoice = 1;
                choices =         (
                                {
                        allowsCustomTextEntry = 0;
                        selected = 1;
                        text = Yes;
                        uuid = "3C7A330D-F16B-4F3E-8ABC-6767A1A6332A";
                    },
                                {
                        allowsCustomTextEntry = 0;
                        selected = 0;
                        text = No;
                        uuid = "0E4F5360-FCCD-4860-9971-86E23BB8F6C1";
                    }
                );
                required = 1;
                tag = "newborn-screening";
                title = "Is newborn screening for classical homocystinuria available in your region/country?";
                uuid = "F7C1A9D5-43AB-420D-80CF-F6644B95C73E";
            };
            type = 1;
        },
        {
            question =     {
                feedback = "This is a free text response";
                required = 1;
                tag = "biggest-unmet-need";
                title = "What do you believe is the biggest unmet need for patients living with classical HCU?";
                uuid = "133E2EDC-8FF4-48D1-8BFA-3A20E5DA0052";
            };
            type = 4;
        }
    )
]
EN

回答 1

Stack Overflow用户

发布于 2022-08-21 19:06:42

根据他们的结果示例,您将得到JSON。当然,将JSON转换为Dictionary是最简单的,但也是最脏的。你基本上是得到“任何”,所以当是时候使用数据,你必须做很多-如你所说-“解码”,验证,等等。

相反,创建一些与您的响应相匹配的Decodable结构。在这种情况下,只需要3种结构:

代码语言:javascript
代码运行次数:0
运行
复制
struct Survey: Codable {
    let questions: [Question]
}

struct Question: Codable {
    let allowsMultipleSelection: Int?
    let choices: [Choice]?
    let required: Int
    let tag: String
    let title: String
    let uuid: String
    let feedback: String?
}

struct Choice: Codable {
    let allowsCustomTextEntry: Int
    let selected: Int
    let text: String
    let uuid: String
}

(我没有核实每个字段,你可以根据需要进行调整。你可以省略任何你不需要/不关心的属性。)

然后你像这样解码它:

代码语言:javascript
代码运行次数:0
运行
复制
// Assume jsonData is your original JSON, which you currently decode as dictionary. So instead you do this:

let decoder = JSONDecoder()
let product = try decoder.decode(Survey.self, from: jsonData)

这种方法允许您

  1. 最重要的是,拥有定义良好的数据使使用数据库更容易。您甚至可以基于可编码结构实现数据库编码器,这意味着您不需要手动遍历数据库的列。也是什么时候。从数据库中读取,您可以得到相同的结构,不需要为您解码的数据库和字典设置2组规则/验证。
  2. 这还允许您对解码的数据有信心:它有正确的名称和类型。您不需要验证它(它是在解码时为您验证的)。您控制需要哪些属性,哪些默认设置,以此类推。在更复杂的情况下,您可能需要将手动解码添加到您的结构中,但是即使这样,手动解码也在结构本身内,很容易更改/使用/测试。所有这一切,而不是庞大混乱的字典,其中有“一些东西”。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73437018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档