【问题标题】:Returning a value from a dictionary in a function in Swift在 Swift 的函数中从字典中返回一个值
【发布时间】:2017-09-08 00:06:17
【问题描述】:

我目前正在从 Apple 的 iBooks 中快速学习可选选项,并且在练习时遇到了一些问题。这些是方向:

假设您正在创建一个用于购物的应用。编写一个函数,该函数将获取要购买的商品的名称并返回该商品的成本。在函数的主体中,通过在字典 stock 中访问该项目来检查它是否有库存。如果是,则通过在字典价格中访问它来返回项目的价格。如果商品缺货,则返回零。调用该函数并传入一个存在于以下字典中的字符串。打印返回值。

var prices = ["Chips": 2.99, "Donuts": 1.89, "Juice": 3.99, "Apple": 0.50, "Banana": 0.25, "Broccoli": 0.99]
var stock = ["Chips": 4, "Donuts": 0, "Juice": 12, "Apple": 6, "Banana": 6, "Broccoli": 3]

func costOfItem(item: String) -> Double? {
    var names = stock.keys
    var amount = stock.values

    for (names, amount) in stock {
        if amount == 0 {
            return nil
        }
    }
}
costOfItem(item: "Chips")

我真的不知道从这里去哪里。在本书中,Optionals 对我来说是一个非常令人困惑的单元。我知道我必须返回一个价格,这将是双倍的。我只是不知道如何进入价格字典并推断并返回它。我尝试了一些在线搜索的方法(使用 .contains 方法,比较字符串),但我得到的都是错误。有人可以指导我完成这个练习吗?我真的很想了解这个话题。

【问题讨论】:

    标签: swift function dictionary optional


    【解决方案1】:

    您不需要循环。而且您不需要第一对namesamount 变量。只需使用 item 名称获取库存数量。如果不为零,请从 prices 字典中获取成本。

    var prices = ["Chips": 2.99, "Donuts": 1.89, "Juice": 3.99, "Apple": 0.50, "Banana": 0.25, "Broccoli": 0.99]
    var stock = ["Chips": 4, "Donuts": 0, "Juice": 12, "Apple": 6, "Banana": 6, "Broccoli": 3]
    
    func costOfItem(item: String) -> Double? {
        if let available = stock[item] {
            if available == 0 {
                // none available
                return nil
            } else {
                // return the price
                return prices[item]
            }
        } else {
            // unknown item
            return nil
        }
    }
    

    【讨论】:

    • 我有一个可怕的习惯,就是在使用代码时把事情过度复杂化。非常感谢您为像我这样的初学者简化它!
    【解决方案2】:

    如果您可以避免 if/then/else...逻辑类型遍历并使您的函数成为纯函数,这意味着您不能只是从外部“获取”数据,它必须被传入。

      func costOfItem(item: String) -> ([String:Double], [String:Int]) -> Double? {
        return { prices, stock in
          guard let itemCount = stock[item],
            itemCount > 0 else { return nil }
          return prices[item]
        }
      }
    

    代码将变得更小/更清晰,代码将从任何实际数据中抽象出来,并且可以 100% 测试函数!

      var prices = ["Chips": 2.99, "Donuts": 1.89, "Juice": 3.99, "Apple": 0.50, "Banana": 0.25, "Broccoli": 0.99]
      var stock = ["Chips": 4, "Donuts": 0, "Juice": 12, "Apple": 6, "Banana": 6, "Broccoli": 3]
    
      costOfItem(item: "Chips")(prices, stock) // 2.99
      
    

    这个函数接受一个 item:String 然后立即返回另一个闭包,该闭包期望 (prices:[String:Double], stock:[String:Int])...的数据...返回函数。

      XCTAssert(costOfItem(item: "Chips")(prices, stock) == 2.99, "Test failed to find correct price for 'Chips' - 4 in stock!")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2015-12-24
      • 2017-11-23
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多