Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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_Xcode - Fatal编程技术网

Swift 如果->;演员阵容?

Swift 如果->;演员阵容?,swift,xcode,Swift,Xcode,我有一本字典作为我的源数据 我有一个对象不适合使用Codable(它是一个可观察的对象,似乎@Published props break Codable) 因此,我在函数中执行以下操作(简化示例) var rtn = TheObjectInQuestion() if let _pid = dict["p_id"] as? String { rtn.pId = _pid } if let _active = dict["active"

我有一本字典作为我的源数据

我有一个对象不适合使用Codable(它是一个可观察的对象,似乎@Published props break Codable)

因此,我在函数中执行以下操作(简化示例)

    var rtn = TheObjectInQuestion()

    if let _pid = dict["p_id"] as? String { rtn.pId = _pid }
    if let _active = dict["active"] as? Int { rtn.active = _active }

    return rtn
我想知道的是,我是否错过了一个更短/更简单的方法来对字典中的对象执行一系列if->let->cast行

如果没有,也不用担心;这当然是很清楚和可读的,因为它是。只是有点乏味


谢谢

我建议将此转换转换为初始值设定项,大致如下:

struct TheObjectInQuestion {
    let pId: String?
    let active: Int

    init(from dict: [String: Any]) {
        self.pId = dict["p_id"] as? String // keep optional
        self.active = dict["active"] as? Int ?? 0 // use default value
    }
}
这样做的好处是允许您说
let obj=theObjectInquest(from:dict)
(而不是
var
无处不在),并且如果单个属性不能是可选的,您可以在一个地方指定默认值


不幸的是,对于这些属性的逐行处理及其到字典键的映射,确实没有什么好方法可以绕过。

我建议将此转换转换为初始值设定项,大致如下:

struct TheObjectInQuestion {
    let pId: String?
    let active: Int

    init(from dict: [String: Any]) {
        self.pId = dict["p_id"] as? String // keep optional
        self.active = dict["active"] as? Int ?? 0 // use default value
    }
}
这样做的好处是允许您说
let obj=theObjectInquest(from:dict)
(而不是
var
无处不在),并且如果单个属性不能是可选的,您可以在一个地方指定默认值


不幸的是,对于这些属性的逐行处理及其到字典键的映射,确实没有什么好方法可以绕过。

远离
[String:Any]
。在“可编程序不好”部分工作。将其转换为结构或类,问题就会消失。如果你在这方面有困难;问这个问题。没有办法使
[String:Any]
成为一种很好的类型。通常你会使用一个可编码的结构,并让ObserveObject保存(或从中初始化)。数据来自Firebase数据存储,我无法控制它,如果没有数据,获取它会给我一堆空值,因此optionals(这是一个棘手的问题)和String/任何类型的情况都会发生。我必须在某个地方处理这个问题,在这种情况下,我试着马上旋转我的物体。老实说,我没有想过把可编码的东西包装在可观察的东西里面,而不是把它变成同一个对象。有趣。谢谢。为了澄清,当我说“optionals只是发生了一些事情”时,我的意思是我必须使我的可编码类中的几乎所有内容都是可选的(在这个数据中,19个字段中只有3个字段保证不为空),这看起来很草率和懒惰。除此之外,我真的很喜欢你的建议,把可编码的东西包装成一个可观察的!再次感谢。@ChrisH离开
[String:Any]
。在“可编程序不好”部分工作。将其转换为结构或类,问题就会消失。如果你在这方面有困难;问这个问题。没有办法使
[String:Any]
成为一种很好的类型。通常你会使用一个可编码的结构,并让ObserveObject保存(或从中初始化)。数据来自Firebase数据存储,我无法控制它,如果没有数据,获取它会给我一堆空值,因此optionals(这是一个棘手的问题)和String/任何类型的情况都会发生。我必须在某个地方处理这个问题,在这种情况下,我试着马上旋转我的物体。老实说,我没有想过把可编码的东西包装在可观察的东西里面,而不是把它变成同一个对象。有趣。谢谢。为了澄清,当我说“optionals只是发生了一些事情”时,我的意思是我必须使我的可编码类中的几乎所有内容都是可选的(在这个数据中,19个字段中只有3个字段保证不为空),这看起来很草率和懒惰。除此之外,我真的很喜欢你的建议,把可编码的东西包装成一个可观察的!再次感谢。@ChrisH我喜欢这样。瘦多了,不知道为什么我不多走一步把它砍下来一点。这真的很有道理。谢谢是的,这很有魅力,加上??”“或者??0(如适用)。谢谢我喜欢这样。瘦多了,不知道为什么我不多走一步把它砍下来一点。这真的很有道理。谢谢是的,这很有魅力,加上??”“或者??0(如适用)。谢谢