我是Swift的新手,所以这可能是一个noob问题,但如果有人清除了疑问我会感激,因为我无法在网上找到任何解释。 在使用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)在此先感谢任何帮助:)
I'm new to Swift so this might come as a noob question but I will be thankful if someone cleared the doubt because I cannot find any explanation online. While using for-in loop, sometimes the variables have not been initialized before and still there is no compiler error. Sometimes if I try to write var/let before them, it shows error- 'let' pattern cannot appear nested in an already immutable context
e.g., in the code below, why have the variables movie and releasedDate not been initialized before?
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)Thanks in advance for any help :)
最满意答案
Swift使用let初始化movie和releaseDate ,但是简化了初始化,这样你就可以假设每次循环迭代时它们都被设置为movies的正确变量。 这就是为什么你不需要在movie和releaseDate之前写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 } }Swift does initialise movie and releaseDate using let, but simplifies that initialisation so that you can just assume that they're set to the correct variables from movies every time the loop iterates. That's why you don't need to write let before movie and releaseDate.
If you write var in front of the variable, you can mutate the value in the array that it points to. If it's a let, then it won't let you mutate it.
For example, if you place var in front of one of the variables, this code will change all the releaseDates to 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 } }更多推荐
发布评论