Swift和大部分语言一样都提供了结构体(Struct)。结构体这个概念最早是出现在C语言中,不过在C语言中没有类(Class)的概念,所以那时结构体也就不会引起混淆,不过在Swift中,结构体和类有许多相似的地方,所以也就经常引起混淆。下面就列举一下Swift中结构体和类的相似点:
* 支持定义属性
* 支持定义方法,这些方法用于实现与类和结构体相关的功能
* 支持定义附属脚本,可以通过附属脚本语法访问他们的值
* 支持定义构造器,主要用于进行初始化
* 支持通过扩展来增强类和结构体默认实现的功能
* 支持协议(protocol),以便对类和结构体提供标准的功能
既然说到了相同点,也不能回避他们的差异,差异就是在功能上类比结构体要强大一点,类支持以下功能:
* 支持继承,允许一个类继承另一个类的功能
* 支持析构方法
* 支持通过引用计数的方式让类对象实例被引用多次
<span style="font-size:18px;"><span style="color:#ff0000;">//创建一个结构体:People</span>
struct People
{
var name:String <span style="color:#ff0000;">//属性name</span>
var age:Int <span style="color:#ff0000;">//属性age</span>
}
<span style="color:#ff0000;">//创建一个结构体实例</span>
var people1 = People(name:"Terry",age:20)
<span style="color:#ff0000;">//引用结构体实例</span>
println("Name:\(people1.name),Age:\(people1.age)")
<span style="color:#ff0000;">//输出的结果是:Name:Terry,Age:20
//注意,在创建结构体实例时必须对其进行初始化
//上边的代码在定义结构体时未对属性name和age进行初始化
//所以在实例化的同时进行初始化,即“var people1 = People(name:"Terry",age:20)”
//或按一下方法进行实例化</span>
struct newPeople
{
var name = ""
var age = 0
}
var people2 = newPeople()
people2.name = "Terry"
people2.age = 20
println("Name:\(people2.name),Age:\(people2.age)") <span style="color:#ff0000;">//这和上边的输出结果是一样的</span></span>
第二种创建实例的方法是不是和类特别像,这就是Swift中结构体与类相似的地方之一。
上边说过在Swift支持方法,这在之前的语言中是不支持的,这也是Swift中结构体的强大之处之一。
struct newPeople1 {
var name = ""
var thisYear:Int = 0
var borthYear:Int = 0
var age:Int
{
return thisYear - borthYear
}
func PrintlnAge() <span style="color:#ff0000;">//定义一个方法用于输出name和age</span>
{
println("Name is:\(name),Age is:\(age)")
}
}
var people3 = newPeople1()
people3.name = "Terry"
people3.thisYear = 2015
people3.borthYear = 1995
people3.PrintlnAge() <span style="color:#ff0000;"> //输出结果为:Name is:Terry,Age is:20</span>
结构体中支持方法,使得结构体的功能变得强大,当然也使得结构体和类容易混淆。
在Swift中,结构体实现了许多类的功能,比如构造器、析构器和下标(Subscript)等功能,正是通过对结构体功能的扩充,使得结构体的功能增强了很多。
<span style="color:#ff0000;">//构造器</span>
struct newPeople2 {
var name:String
init() <span style="color:#ff0000;">//当创建newPeople2时会调用init方法</span>
{
name = "Terry"
}
}
var people4 = newPeople2()
println("Name is:\(people4.name)")
结构体的很多新功能还没有一一举例说明,后续还会继续补充。。。