从Swift中的函数中的字典返回值

时间:2017-09-08 00:06:18

标签: swift function dictionary optional

我目前正在学习苹果iBooks中的一些选项,并且在练习中遇到了一些问题。这些是方向:

  

想象一下,您正在创建一个用于购物的应用。编写一个函数,该函数将采用要购买的项目的名称,并将返回该项目的成本。在该功能的正文中,通过在字典库存中访问该项目来检查该项目是否有库存。如果是,则通过在字典价格中访问该项目的价格来返回该项目的价格。如果该商品缺货,请返回零。调用该函数并传入下面的字典中存在的String。打印返回值。

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方法,比较字符串),我得到的都是错误。有人可以带我参加这个练习吗?我真的很想了解这个话题。

2 个答案:

答案 0 :(得分:2)

你不需要循环。而且您不需要第一对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
    }
}

答案 1 :(得分:0)

如果您可以避免if / then / else ...逻辑类型的walk并使函数纯净,这意味着您不能只是从外部“抓取”数据,而必须将其传入。

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<div class="container-fluid h-100 d-flex flex-column">
  <div class="row h-100" style="background-color: grey;">
    top<br>
  </div>
  <div class="row h-100" style="background-color: yellow;">
    <div class="col-lg-9 h-100" style="overflow-y: auto;">
      somethign1<br> somethign2
      <br> somethign3
      <br> somethign4
      <br> somethign5
      <br> somethign6
      <br> somethign7
      <br> somethign8
      <br> somethign9
      <br> somethign10
      <br> somethign11
      <br> somethign12
      <br> somethign13
      <br> somethign14
      <br> somethign15
      <br> somethign16
      <br> somethign17
      <br> somethign18
      <br> somethign19
      <br> somethign20
      <br> somethign21
      <br> somethign22
      <br> somethign23
      <br> somethign24
      <br> somethign25
      <br> somethign26
      <br> somethign27
      <br> somethign28
      <br> somethign29
      <br> somethign30
      <br> somethign31
      <br> somethign32
      <br>
    </div>
    <div class="col-lg-1 h-100 bg-danger"></div>
    <div class="col-lg-2 bg-primary h-100">s1<br>s2<br></div>
  </div>
  <div class="row h-100" style="background-color: green;">
    bottom<br>
  </div>
</div>

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

  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]
    }
  }

此函数接受一个item:String,然后立即返回另一个闭包,该闭包期望(prices:[String:Double],stock:[String:Int])...的数据由第二个括号传递,调用返回的函数。

  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