Ios 将NSDictionary中的函数作为值解码到swift对象

Ios 将NSDictionary中的函数作为值解码到swift对象,ios,swift,struct,nsdictionary,decode,Ios,Swift,Struct,Nsdictionary,Decode,任何意见或建议将不胜感激!谢谢 我有一个问题要解决,似乎我在任何地方都找不到答案。一些背景:我们正在更新我们的ios应用程序,生产版本是用obj-c编写的,但我们在Swift中开发了新的UI功能。因此,我们有一个字典,它为我们的快速开发提供了一些价值,其中包含了许多重要的UI数据。至于现在,我们只是循环dict来获取值。我想将其转换为swift对象,以便更容易访问所需的值。问题是字典包含函数调用和UIImage类型的值。将字典解析为swift对象的最聪明的方法是什么?字典: let dict :

任何意见或建议将不胜感激!谢谢

我有一个问题要解决,似乎我在任何地方都找不到答案。一些背景:我们正在更新我们的ios应用程序,生产版本是用obj-c编写的,但我们在Swift中开发了新的UI功能。因此,我们有一个字典,它为我们的快速开发提供了一些价值,其中包含了许多重要的UI数据。至于现在,我们只是循环dict来获取值。我想将其转换为swift对象,以便更容易访问所需的值。问题是字典包含函数调用和UIImage类型的值。将字典解析为swift对象的最聪明的方法是什么?字典:

let dict : [String: Any] = [
    "keySelectedMenuButton" : 0,
    "keySettButtCallback"  : settTapCallback,
    "keyInfoButtCallback"  : logoTapCallback,
    "keyObjectMenuCallback": menuButtonTapCallback,
    "buttonListChanged"    : doneEditTapCallback,
    "keyObjectArray"      : [
        ["keyObjectTitle"    : "Home",
         //  "keyObjectLineImage": UIImage(named: "objektu atskyrimas_4x")!,
            "keyObjCtrlButtCollectionArray" : [
                
                ["keyCtrlItemTitle"      : "Smart Menu",
                 "keyCtrlItemSubtitle"   : "",
                 //"keyCtrlItemImage"      : UIImage(named: "ico_rocket")!,
                    "keyCtrlObjectAfterTap" : buttonTap1Callback
                ],
                ["keyCtrlItemTitle"      : "Lock",
                 "keyCtrlItemSubtitle"   : "doors",
                 //"keyCtrlItemImage"      : UIImage(named: "ico_lock_1@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ],
                ["keyCtrlItemTitle"      : "Unlock",
                 "keyCtrlItemSubtitle"   : "Gates",
                 // "keyCtrlItemImage"      : UIImage(named: "ico_lock_0@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ],
                ["keyCtrlItemTitle"      : "Ignore",
                 "keyCtrlItemSubtitle"   : "",
                 //  "keyCtrlItemImage"      : UIImage(named: "ico_shield@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTap1Callback
                ],
                ["keyCtrlItemTitle"      : "Stop",
                 "keyCtrlItemSubtitle"   : "",
                 //  "keyCtrlItemImage"      : UIImage(named: "ico_stop")!
                    "keyCtrlObjectAfterTap" : buttonTap2Callback
                ],
                ["keyCtrlItemTitle"      : "State",
                 "keyCtrlItemSubtitle"   : "",
                 //   "keyCtrlItemImage"      : UIImage(named: "ico_query@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTap3Callback
                ],
                ["keyCtrlItemTitle"      : "Controller",
                 "keyCtrlItemSubtitle"   : "",
                 //   "keyCtrlItemImage"      : UIImage(named: "ico_settings_lines")!,
                    "keyCtrlObjectAfterTap" : buttonTap1Callback
                ],
                ["keyCtrlItemTitle"      : "Logs",
                 "keyCtrlItemSubtitle"   : "",
                 //  "keyCtrlItemImage"      : UIImage(named: "ico_log@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTap2Callback
                ],
                ["keyCtrlItemTitle"      : "Notifications",
                 "keyCtrlItemSubtitle"   : "",
                 //   "keyCtrlItemImage"      : UIImage(named: "ico_notifications")!,
                    "keyCtrlObjectAfterTap" : buttonTap3Callback
                ]]
        ],
        ["keyObjectTitle":"Auto",
         //"keyObjectLineImage": UIImage(named: "objektu atskyrimas_4x")!,
            "keyObjCtrlButtCollectionArray" : [
                ["keyCtrlItemTitle"      : "Smart Menu",
                 "keyCtrlItemSubtitle"   : "",
                 //  "keyCtrlItemImage"      : UIImage(named: "ico_rocket")!,
                    "keyCtrlObjectAfterTap" : buttonTap2Callback
                ],
                ["keyCtrlItemTitle"      : "Lock",
                 "keyCtrlItemSubtitle"   : "Backdoor",
                 //   "keyCtrlItemImage"      : UIImage(named: "ico_lock_1@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ],
                ["keyCtrlItemTitle"      : "Unlock",
                 "keyCtrlItemSubtitle"   : "Fence",
                 //    "keyCtrlItemImage"      : UIImage(named: "ico_lock_0@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ],
                ["keyCtrlItemTitle"      : "Ignore",
                 "keyCtrlItemSubtitle"   : "",
                 //    "keyCtrlItemImage"      : UIImage(named: "ico_shield@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTap1Callback
                ],
                ["keyCtrlItemTitle"      : "Stop",
                 "keyCtrlItemSubtitle"   : "",
                 //   "keyCtrlItemImage"      : UIImage(named: "ico_stop")!,
                    "keyCtrlObjectAfterTap" : buttonTap3Callback
                ]]
        ],
        ["keyObjectTitle":"Basement",
         //   "keyObjectLineImage": UIImage(),
            "keyObjCtrlButtCollectionArray" : [
                ["keyCtrlItemTitle"      : "Smart Menu",
                 "keyCtrlItemSubtitle"   : "",
                 //    "keyCtrlItemImage"      : UIImage(named: "ico_rocket")!,
                    "keyCtrlObjectAfterTap" : buttonTap1Callback
                ],
                ["keyCtrlItemTitle"      : "Lock",
                 "keyCtrlItemSubtitle"   : "",
                 //      "keyCtrlItemImage"      : UIImage(named: "ico_lock_1@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ],
                ["keyCtrlItemTitle"      : "Unlock",
                 "keyCtrlItemSubtitle"   : "",
                 //         "keyCtrlItemImage"      : UIImage(named: "ico_lock_0@x3")!,
                    "keyCtrlObjectAfterTap" : buttonTapCallback
                ]]
        ]
    ]
]


func logoTapCallback(){
    print("logo tapped")

}

func menuButtonTapCallback() {
    print("menu button tapped ")
    
}

func buttonTapCallback(){
    print("button tapped")
    
}

func buttonTap1Callback(){
    print("button tapped 1")
}

func buttonTap2Callback(){
    print("button tapped 2")
}

func buttonTap3Callback(){
    print("button tapped 3")
}

func settTapCallback(){
    print("settTap")
}

func doneEditTapCallback(){
    print("doneEditTap")
}


// Dictionary structure I would like to use:

struct InitialDictionaryStructure {
    var keySelectedMenuButton            : Int
    var keySettButtCallback              : ()->Void
    var keyInfoButtCallback              : ()->Void
    var keyObjectMenuCallback            : ()->Void
    var buttonListChanged                : ()->Void
    var keyObjectArray                   : [[Object]]
    
}

struct Object {
    var keyObjectTitle                   : String
    //var keyObjectLineImage               : UIImage
    var keyObjCtrlButtCollectionArray    : [Button]
    
    
}

struct Button {
    var keyCtrlItemTitle                 : String
    var keyCtrlItemSubtitle              : String
    //var keyCtrlItemImage                 : UIImage
    var keyCtrlObjectAfterTap            : ()-> Void
}
没有聪明的方法,你必须添加初始值设定项

如果不打算修改这些值,请将结构成员声明为常量,我稍微缩短了成员名称,省略了冗余信息

struct InitialDictionaryStructure {
    let menuButton            : Int
    let settButtCallback      : ()->Void
    let infoButtCallback      : ()->Void
    let objectMenuCallback    : ()->Void
    let buttonListChanged     : ()->Void
    let objects               : [Object]
    
    init(dictionary : [String:Any]) {
        menuButton = dictionary["keySelectedMenuButton"] as! Int
        settButtCallback = dictionary["keySettButtCallback"] as! ()-> Void
        infoButtCallback = dictionary["keyInfoButtCallback"] as! ()-> Void
        objectMenuCallback = dictionary["keyObjectMenuCallback"] as! ()-> Void
        buttonListChanged = dictionary["buttonListChanged"] as! ()-> Void
        let objectData = dictionary["keyObjectArray"] as! [[String:Any]]
        objects = objectData.map(Object.init)
    }
}

struct Object {
    let title                  : String
    // let lineImage           : UIImage
    let buttons                : [Button]
    
    init(dictionary : [String:Any]) {
        title = dictionary["keyObjectTitle"] as! String
        // lineImage = dictionary["keyObjectLineImage"] as! UIImage
        let buttonData = dictionary["keyObjCtrlButtCollectionArray"] as! [[String:Any]]
        buttons = buttonData.map(Button.init)
    }
}

struct Button {
    let title                 : String
    let subtitle              : String
    // let image                 : UIImage
    let objectAfterTap        : ()-> Void
    
    init(dictionary : [String:Any]) {
        title = dictionary["keyCtrlItemTitle"] as! String
        subtitle = dictionary["keyCtrlItemSubtitle"] as! String
        // image = dictionary["keyCtrlItemImage"] as! UIImage
        objectAfterTap = dictionary["keyCtrlObjectAfterTap"] as! ()-> Void
    }
}

请考虑这是一个简单的例子,没有任何类型和<代码> nIL/COD>检查。如果字典不包含所有具有正确类型的键,代码将崩溃

要创建项目,请执行以下操作:

let initialDictionaryStructure = InitialDictionaryStructure(dictionary: dict)
print(initialDictionaryStructure)

由于函数与JSON或PropertyList不兼容,您必须在每个结构中编写一个自定义的
init(dictionary:[String:Any])
方法,并手动赋值。@vadian谢谢您的回答。也许您可以提供一个示例,说明实现是什么样子的?非常感谢!非常感谢您的解答和解释!我很感激!我想从现在起我会自己处理一切,再次感谢你。