我目前正在学习苹果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方法,比较字符串),我得到的都是错误。有人可以带我参加这个练习吗?我真的很想了解这个话题。
答案 0 :(得分:2)
你不需要循环。而且您不需要第一对names
和amount
变量。只需使用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