属性和类实例之间的区别swift

时间:2017-07-12 10:31:26

标签: ios swift

我是swift编程的新手,我有一个问题如下: 我有一个名为Weather的课程

class Weather {

}

然后我定义了两件事:

var currentWeather1 = Weather()

var currentWeather2: Weather!

它们的语法不同或含义相同吗?他们用这两个陈述在记忆中实际创造了什么?

3 个答案:

答案 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