【问题标题】:For Loop in Apple SwiftApple Swift 中的 For 循环
【发布时间】:2014-07-26 11:18:08
【问题描述】:

Apple 新发布的语言 Swift 在official documentation 上有一个示例。例子是这样的;

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

这很简单,但作为一个额外的练习,它需要添加另一个变量以返回最大数字的类型(即这里的情况是 Square)

但是,我似乎无法弄清楚这里的“(种类,数字)”代表什么以及我应该如何让我的 for 循环遍历所有 Dictionary(interestingNumbers) 键并找到哪个键具有最大的数字.

提前感谢大家的帮助

【问题讨论】:

  • 调试它,看看kind 包含什么。这应该很清楚。

标签: for-loop dictionary swift


【解决方案1】:

Swift 允许您使用 tuple-syntax (key, value) 遍历字典。因此,在 for 循环的每次迭代中,Swift 都关心将指定的元组变量(在您的情况下为 kindnumber)重新分配给实际的字典记录。

要找出示例中包含最高数字的键,您可以按如下方式扩展您的代码:

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]

var largest = 0
var largestKey = ""
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
            largestKey = kind
        }
    }
}
largest     // =25
largestKey  // ="Square"

或者,如果您想练习元组语法,请尝试(结果相同):

var largest = 0
var largestKey = ""
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            (largestKey, largest) = (kind, number)
        }
    }
}
largest     // =25
largestKey  // ="Square"

【讨论】:

  • 非常感谢!在文档的后面部分解释元组语法真的很奇怪,这就是为什么这个简单的例子让我感到困惑。
【解决方案2】:

我似乎无法弄清楚这里的“(种类,数字)”代表什么

这是一个包含数字类型的键值对(元组)。这种语法被称为分解,基本上,在循环中,您可以访问 kind 作为种类和 numbers 作为映射它的数字。

例如,在某些迭代中:

kind  // "Prime"
numbers // [2, 3, 5, 7, 11, 13]

引用指南:

您还可以遍历字典以访问其键值对。当字典被迭代时,字典中的每一项都作为 (key, value) 元组返回,您可以将 (key, value) 元组的成员分解为显式命名的常量,以便在 for-in 循环的主体中使用。

【讨论】:

    【解决方案3】:
    for (kind, numbers) in interestingNumbers{}
    

    这个for循环实际上枚举了字典interestingNumbers的键/值对。其中kind,数字是对应的

    kind:Prime       //Key
    numbers: [2, 3, 5, 7, 11, 13] //Value  
    

    这里是练习的完整解决方案

    let interestingNumbers = [
        "Prime": [2, 3, 5, 7, 11, 13],
        "Fibonacci": [1, 1, 2, 3, 5, 8],
        "Square": [1, 4, 9, 16, 25],
    ]
    var largest = 0
    var type: String = ""
    for (kind, numbers) in interestingNumbers {
        for number in numbers {
            if number > largest {
                largest = number
                type = kind
            }
        }
    }
    largest
    type
    

    【讨论】:

      【解决方案4】:

      但是,我似乎无法弄清楚这里的“(种类,数字)”代表什么

      循环遍历字典,每次迭代都会给你一个键和相关的值。这些在此处称为kind(键)和numbers(值)。你可以选择任何你想要的名字。

      我应该如何让我的 for 循环遍历所有 Dictionary(interestingNumbers) 键并找到哪个键的数字最大。

      您在kind 循环变量中依次获取每个键。

      一旦找到产生新largest 的变量,您可以将其分配给结果变量,例如largestKind

      在循环结束时,largestKind 将包含具有最大数字的数组的键(该数字是您已经拥有的 largest)。

      【讨论】:

        【解决方案5】:
        let interestingNumbers = [
            "Prime": [2, 3, 5, 7, 11, 13],
            "Fibonacci": [1, 1, 2, 3, 5, 8],
            "Square": [1, 4, 9, 16, 25],
        ]
        var largest = 0
        for (kind, numbers) in interestingNumbers {
            for number in numbers {
                if number > largest {
                    largest = number
                }
            }
        }
        largest
        

        这将返回我们在字典中的一对 (String,Int) 类似于函数返回多个值如下,

           func refreshWebPage() -> (status:String,code:Int){
            //refresh logic
                        return ("Success",200)
            }
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 2015-05-05
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          • 2011-10-18
          • 1970-01-01
          相关资源
          最近更新 更多