我对Xcode在Swift编程语言指南中给我的这个实验的答案有点困惑:

// Use a for-in to iterate through a dictionary (experiment)

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

我知道当字典被横切时,最大的数字被设置为变量,最大。然而,我很困惑,为什么Xcode说最大值要设置5次,或1次,或3次,这取决于每次测试。

当查看代码时,我看到它应该在“Prime”中单独设置6次(2,3,5,7,11,13)。然后它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大的数字,目前从“素数”开始设置为13。然后,将其设置为16,最后在“Square”中设置为25,总共产生8次。

我是不是忽略了一些显而易见的东西?


当前回答

Swift(和其他语言)的字典没有排序。在遍历字典时,不能保证顺序与初始化顺序匹配。在这个例子中,Swift先处理“Square”键。您可以通过向循环中添加print语句来查看这一点。25是Square的第5个元素,所以最大的将为Square中的5个元素设置5次,然后将保持在25。

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 {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

这个打印:

:广场 : ' :斐波那契

其他回答

Swift(和其他语言)的字典没有排序。在遍历字典时,不能保证顺序与初始化顺序匹配。在这个例子中,Swift先处理“Square”键。您可以通过向循环中添加print语句来查看这一点。25是Square的第5个元素,所以最大的将为Square中的5个元素设置5次,然后将保持在25。

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 {
    println("kind: \(kind)")
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

这个打印:

:广场 : ' :斐波那契

下面是这个实验的替代方案(Swift 3.0)。这告诉你哪种数字是最大的。

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 whichKind: String? = nil

for (kind, numbers) in interestingNumbers {
    for number in numbers {
    if number > largest {
        whichKind = kind
        largest = number
    }
  }
}

print(whichKind)
print(largest)

OUTPUT:
Optional("Square")
25
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

结果是

(“FirstName”、“Maninder”) (“姓”,“辛格”) (“地址”、“昌迪加尔”)

这是一个用户定义的遍历字典的函数:

func findDic(dict: [String: String]) {
    for (key, value) in dict {
        print("\(key) : \(value)")
    }
}

findDic(dict: ["Animal": "Lion", "Bird": "Sparrow"])
// prints…
// Animal : Lion 
// Bird : Sparrow

如果你想遍历所有的值:

dict.values.forEach { value in
    // print(value)
}