我是swift编程的新手,我有一个问题如下: 我有一个名为Weather的课程
class Weather {
}
然后我定义了两件事:
var currentWeather1 = Weather()
var currentWeather2: Weather!
它们的语法不同或含义相同吗?他们用这两个陈述在记忆中实际创造了什么?
答案 0 :(得分:4)
var currentWeather1 = Weather()
这声明了一个Weather类型的变量,并为其分配一个新的Weather实例。语法Weather()
创建一个实例并运行其初始化程序。编译器将currentWeather1
的类型推断为Weather
。上面的陈述完全等同于
var currentWeather1: Weather = Weather()
另一个声明:
var currentWeather2: Weather!
声明一个隐式的可选变量。该变量是可选类型,即它的类型是Optional<Weather>
。这意味着如果你想获得价值,它需要被解开。但是,!
表示编译器会为您提供解包代码。普通的可选项如下所示:
var currentWeather3: Weather?
但是当你需要使用它时,你必须打开它,例如
if let foo = currentWeather3
{
// foo is the unwrapped weather
}
let string = currentWeather3?.description // string is an optional String
let string2 = currentWeather3!.description // string2 is a String
!
的最后一个示例是强制解包。如果currentWeather3
为nil,则执行该行时,程序将崩溃。 currentWeather2
的声明意味着编译器会将每次提及currentWeather2
视为在其后面隐含!
。
答案 1 :(得分:0)
简单的答案是
var currentWeather2: Weather!
通过在系统表中创建Weather
的引用来声明变量。但是没有为变量
var currentWeather1 = Weather()
通过分配内存创建 Weather
对象,并将变量的位置分配给年龄的系统表条目。
答案 2 :(得分:0)
var currentWeather2: Weather!
上述语句不为Weather实例分配内存,它只分配堆栈变量currentWeather2。仅在堆栈上分配引用指针。它到达currentWeather2 = Weather()
的时间,它分配在&#34;堆&#34;。
访问类属性&amp;方法直接从类名引用,而不是使用类的实例。
在C#中了解更多信息会有所帮助,但概念是相同的 https://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types