您如何利用Swift功能来重构此递归函数?

伊巴科斯

我一直在研究一个递归函数,以从表示为NSDictionary的JSON数据中提取String值。该函数允许您执行以下操作:

if let value = extractFromNestedDictionary(["fee" : ["fi" : ["fo" : "fum"]]], withKeys: ["fee", "fi", "fo"]) {
    println("\(value) is the value after traversing fee-fi-fo");
}

函数实现如下所示:

// Recursively retrieves the nested dictionaries for each key in `keys`,
// until the value for the last key is retrieved, which is returned as a String?
func extractFromNestedDictionary(dictionary: NSDictionary, withKeys keys: [String]) -> String? {
    if keys.isEmpty { return nil }
    let head = keys[0]
    if let result: AnyObject = dictionary[head] {
        if keys.count == 1 {
            return result as? String
        } else {
            let tail: [String] = Array(keys[1..<keys.count])
            if let result = result as? NSDictionary {
                return extractFromNestedDictionary(result, withKeys: tail)
            } else {
                return nil
            }
        }
    } else {
        return nil
    }
}

Swift 1.2 / 2.x中是否存在与可选绑定相关的一些语法功能,这些功能可以:

  • 使此功能更简洁
  • 减少if嵌套
马丁·R

除了递归,您还可以reducekeys数组上使用来遍历字典:

func extractFromNestedDictionary(dictionary: NSDictionary, withKeys keys: [String]) -> String? {

    return reduce(keys, dictionary as AnyObject?) {
        ($0 as? NSDictionary)?[$1] 
    } as? String
}

在闭包内部,$0是当前级别和$1当前键上的(可选)对象如果$0是字典并且具有当前键的值,则闭包将在下一级返回对象nil否则返回。reduce()那么从的返回值就是最后一级或上的对象nil

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何重构/使此代码更具pythonic功能?

来自分类Dev

如何递归应用此功能

来自分类Dev

如何在Swift中编写此递归函数?

来自分类Dev

您如何将此列表理解扩展为for循环,以了解此递归函数?

来自分类Dev

如何使此阶乘函数递归?

来自分类Dev

如何停止此递归函数?

来自分类Dev

如何使用State monad重构代码,以通过添加更多功能来增加模块化?

来自分类Dev

此功能如何工作?(BST递归)

来自分类Dev

使用Scikit-Learn的SVR,您如何结合分类和连续功能来预测目标?

来自分类Dev

如何在Power Bi中利用DAX功能来达到以下要求?

来自分类Dev

如何重构此方法?

来自分类Dev

如何编写此递归Haskell函数

来自分类Dev

此递归函数如何更改“历史”变量?

来自分类Dev

如何编写此迭代函数以递归?

来自分类Dev

此递归函数如何返回正确答案?

来自分类Dev

您如何获得此功能以读取多个选择?

来自分类Dev

您如何获得此功能以读取多个选择?

来自分类Dev

递归CTE表-计算EWMA(EMA)-如何优化/重构此代码,以免每次都被TDWM杀死?

来自分类Dev

如何重构此递归策略表达策略以参数化其长度?

来自分类Dev

如何重构此ANTLR4语法,以使其不会相互遗留递归?

来自分类Dev

此递归函数的意义

来自分类Dev

此递归二进制代码功能如何工作?

来自分类Dev

如何使用C ++ 14和C ++ 1z中的功能来缩短此可变参数模板代码?

来自分类Dev

如何重构(缩短)此查询

来自分类Dev

如何重构此Java代码

来自分类Dev

如何利用递归函数帮助对矩阵行进行排序-R

来自分类Dev

您如何在Swift中复制此Java接口?

来自分类Dev

如何使此递归函数更有效?

来自分类Dev

此递归数组置换函数如何在后台运行?

Related 相关文章

  1. 1

    如何重构/使此代码更具pythonic功能?

  2. 2

    如何递归应用此功能

  3. 3

    如何在Swift中编写此递归函数?

  4. 4

    您如何将此列表理解扩展为for循环,以了解此递归函数?

  5. 5

    如何使此阶乘函数递归?

  6. 6

    如何停止此递归函数?

  7. 7

    如何使用State monad重构代码,以通过添加更多功能来增加模块化?

  8. 8

    此功能如何工作?(BST递归)

  9. 9

    使用Scikit-Learn的SVR,您如何结合分类和连续功能来预测目标?

  10. 10

    如何在Power Bi中利用DAX功能来达到以下要求?

  11. 11

    如何重构此方法?

  12. 12

    如何编写此递归Haskell函数

  13. 13

    此递归函数如何更改“历史”变量?

  14. 14

    如何编写此迭代函数以递归?

  15. 15

    此递归函数如何返回正确答案?

  16. 16

    您如何获得此功能以读取多个选择?

  17. 17

    您如何获得此功能以读取多个选择?

  18. 18

    递归CTE表-计算EWMA(EMA)-如何优化/重构此代码,以免每次都被TDWM杀死?

  19. 19

    如何重构此递归策略表达策略以参数化其长度?

  20. 20

    如何重构此ANTLR4语法,以使其不会相互遗留递归?

  21. 21

    此递归函数的意义

  22. 22

    此递归二进制代码功能如何工作?

  23. 23

    如何使用C ++ 14和C ++ 1z中的功能来缩短此可变参数模板代码?

  24. 24

    如何重构(缩短)此查询

  25. 25

    如何重构此Java代码

  26. 26

    如何利用递归函数帮助对矩阵行进行排序-R

  27. 27

    您如何在Swift中复制此Java接口?

  28. 28

    如何使此递归函数更有效?

  29. 29

    此递归数组置换函数如何在后台运行?

热门标签

归档