在不带var/let的Swift中初始化变量

在不带var/let的Swift中初始化变量,swift,var,let,for-in-loop,Swift,Var,Let,For In Loop,我是Swift的新手,所以这可能是一个noob问题,但如果有人澄清了这个疑问,我会很感激,因为我在网上找不到任何解释。在使用for-in-loop时,有时变量之前没有初始化,并且仍然没有编译器错误。有时,如果我尝试在它们前面写var/let,它会显示错误-“let”模式不能嵌套在已经不可变的上下文中 e、 例如,在下面的代码中,为什么变量movie和releasedDate之前没有初始化 class MovieArchive { func filterByYear(year:Int, movie

我是Swift的新手,所以这可能是一个noob问题,但如果有人澄清了这个疑问,我会很感激,因为我在网上找不到任何解释。在使用for-in-loop时,有时变量之前没有初始化,并且仍然没有编译器错误。有时,如果我尝试在它们前面写var/let,它会显示错误-“let”模式不能嵌套在已经不可变的上下文中


e、 例如,在下面的代码中,为什么变量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)
class电影档案{
func filterByYear(年份:Int,电影:Dictionary)->[String]{
var filteredArray=[String]()
电影中的(电影、发行日期){
如果年份==发布日期{
filteredArray.append(电影)
}
}
返回过滤器阵列
}
}
var Aithemodovies=[“大都会”:1927,“2001:太空漫游”:1968,“刀锋杀手”:1982,“战争游戏”:1983,“终结者”:1984,“黑客帝国”:1999,“人工智能”:2001,“她”:2013,“前机械人”:2015]
var myArchive=MovieArchive()
myArchive.FilterByear(年份:2013年)
,电影:Aithemodovies)

提前感谢您的帮助:)

Swift确实使用
let
初始化
movie
releaseDate
,但简化了初始化过程,因此每次循环迭代时,您都可以假设它们已设置为
movies
中的正确变量。这就是为什么您不需要在
电影
发布日期
之前编写let

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

例如,如果将var放在其中一个变量前面,此代码将所有
发布日期更改为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
    }
}
class电影档案{
func filterByYear(年份:Int,电影:Dictionary)->[String]{
var filteredArray=[String]()
电影中的(电影,var releaseDate){
发布日期=2000
如果年份==发布日期{
filteredArray.append(电影)
}
}
返回过滤器阵列
}
}
(电影,发布日期)
是一个变量元组。Swift允许使用元组一次初始化多个变量

let (movie, releaseDate) = ("Metropolis", 1927)
for in
循环是重新声明集合中每个元素的常量的语法糖。在这种情况下,
let
是隐式的

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

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


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

如果不考虑实际用法,让我们只讨论
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
声明。这只是让你的生活更简单的一种方式。别担心,高兴点。

请给出一个例子,说明您描述的错误消息出现在哪里。“例如,在下面的代码中,为什么变量movie和releasedDate以前没有初始化?”因为这就是语言的工作方式。您可能喜欢阅读苹果提供的Swift电子书。您的代码在我的游戏场上运行良好。@appzYourLife先生/女士代码没有错误,但如果我尝试在电影或发行日期之前编写var,则会出现以下错误/Variable'movie'从未变异;考虑更改为“让”常量,如果写“让”,错误是“让”模式不能嵌套在一个已经不可变的上下文中,而这种情况只发生在某些地方。在许多for-In循环中,它要求我编写var。感谢您的关注。那么默认初始化设置为let吗?因为如果我对movie变量进行更改,它会提示我初始化为var。我只是对何时使用var和何时不使用var感到困惑。感谢您的关注。@AnuritaSrivastava更新了我的答案:)我知道var用于非常量变量,所以当我在下一行声明releaseDate时,您的代码不会出错,但如果我不这样做,则会显示错误。为什么会发生这种情况?这是因为如果你不改变releaseDate,就没有必要将它设置为一个变量。Swift检测到它没有被改变,然后给出一个错误,要求你删除变量。谢谢。我现在明白了这个概念。:)所以我对何时使用var和何时不使用var感到困惑。比如我们为什么要这样做?感谢您的关注。@AnuritaSrivastava几乎总是使用var/let。我只能想到前面描述的两种情况中的省略,
for in
和闭包。此外,有时还存在隐式变量/常量,如
self
$0
error
(在
中,确实捕获了
)感谢您的洞察力!:)很抱歉,我的问题是不使用任何一个变量,而且在我编写var时它会显示一个错误。那么在1…3{}
中为I编写
在语法上正确吗?我知道在编写
var
时它会显示一个错误。但我向您展示了如何编写
var
而不出错。如果你不看,不听,你就学不会。
    for i in 1...3 { // ok
        print(i)
    }