在没有 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
初始化 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
}
}
(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
。这只是让您的生活更简单的一种方式。别着急,开心就好。
我是 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
初始化 movie
和 releaseDate
,但简化了初始化,这样你就可以假设它们被设置为正确的变量movies
每次循环迭代。这就是为什么你不需要在 movie
和 releaseDate
.
如果你在变量前面写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
。这只是让您的生活更简单的一种方式。别着急,开心就好。