在没有 var/let 的情况下初始化 Swift 中的变量

Initializing variables in Swift without var/let

我是 Swift 的新手,所以这可能是一个菜鸟问题,但如果有人消除了疑问,我将不胜感激,因为我在网上找不到任何解释。在使用 for-in 循环时,有时变量没有被初始化,仍然没有编译错误。有时,如果我尝试在它们之前写 var/let,它会显示错误 - 'let' 模式无法嵌套在已经不可变的上下文中

例如,在下面的代码中,为什么之前没有初始化变量movie和releasedDate?

class MovieArchive {
func filterByYear(year:Int, movies:Dictionary<String, Int> ) -> [String]{
    var filteredArray = [String]()
    for (movie, releaseDate) in movies {
        if year == releaseDate {
            filteredArray.append(movie)
        }
    }
    return filteredArray
}

}

var aiThemedMovies = ["Metropolis": 1927, "2001: A Space Odyssey": 1968, "Blade Runner": 1982, "War Games": 1983, "Terminator": 1984, "The Matrix": 1999, "A.I.": 2001, "Her": 2013, "Ex Machina": 2015]

var myArchive = MovieArchive()
myArchive.filterByYear(year: 2013
, movies: aiThemedMovies)

提前感谢您的帮助:)

Swift 使用 let 初始化 moviereleaseDate,但简化了初始化,这样你就可以假设它们被设置为正确的变量movies 每次循环迭代。这就是为什么你不需要在 moviereleaseDate.

之前写 let

如果你在变量前面写var,你可以改变它指向的数组中的值。如果它是一个 let,那么它不会让你变异它。

例如,如果将 var 放在其中一个变量的前面,此代码会将所有 releaseDates 更改为 2000:

class MovieArchive {
    func filterByYear(year:Int, movies:Dictionary<String, Int> ) -> [String]{
        var filteredArray = [String]()
        for (movie, var releaseDate) in movies {
            releaseDate = 2000
            if year == releaseDate {
                filteredArray.append(movie)
            }
        }
        return filteredArray
    }
}

(movie, releaseDate) 是一个变量元组。 Swift 允许使用元组一次初始化多个变量。

let (movie, releaseDate) = ("Metropolis", 1927)

for-in 循环是语法糖,用于为集合中的每个元素重新声明这些常量。在这种情况下,let 是隐含的。

还有其他方法可以使用隐式 let 获取命名常量,例如使用 闭包 :

class MovieArchive {
    func filterByYear(year: Int, movies: [String: Int]) -> [String] {
        return movies.filter { (movie, releaseDate) -> Bool in
            year == releaseDate
            }.map { [=11=].key }
    }
}

顺便说一句,上面的示例给出了与您的代码相同的结果。

但是除了for-in、func参数和闭包之外,我想不出在Swift中会省略let/var关键字的其他情况3.0.

不关心实际使用,我们只讨论在 for 循环中语法上合法的内容。这是合法的:

    for var i in 1...3 { // ok
        print(i)
        i = 0
    }

这是不合法的:

    for let i in 1...3 { // error
        print(i)
    }

为什么?因为 let 隐式 当你这样说时:

    for i in 1...3 { // ok
        print(i)
    }

你没有说 var,所以 i 自动声明为 let。这只是让您的生活更简单的一种方式。别着急,开心就好。