Swift结构体和类
定义一个类或者结构体
结构体和类有着类似的定义方式,我们可以通过class 和struct来进行定义。
struct Resolution {
var width = 0
var height = 0
}//定义一个结构体
//在这个结构体中,两个变量被赋值为0,所以被认为是整型变量
//结构体总是以复制的方式传递dsdddddsf
class VideoMode {
var resolution = Resolution() //分辨率,被初始化成一个Resolution结构体的实例
var interlaced = false
var framRate = 0.0
var name:String? //会被默认赋值为nil,是一个可选类型
}
实例化类和结构体的语法很相似
let someResolution = Resolution()
let someVideoMode = VideoMode()
这样的初始化方式使得实行均会被初始化成默认值
下面是属性的访问,通过使用语法.
可与你访问实例中所有含有的属性
,例如下面这个
println("The Width Of someResolution is \(someResolution.width)")
将会输出 “The Width Of someResolution is 0”
也可以访问子属性:
someVideoMode.resolution.width = 1920
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
输出“The width of someVideoMode is 1920”
@H_404_91@请注意:与Objective-C不同的是,Swift允许直接对结构体属性的子属性,上面的例子就是直接实质了someVideoMode中的resolution的with的值,而这个操作不需要对resolution属性进行重新的设置
结构体成员的逐一初始化
let vga = Resolution(width: 640,height: 480)
与结构体不同的是,类的实例没有默认成员的逐一初始化器,而由类的构造器来代替相关的工作,结构体和枚举类型是值类型
,值类型被赋予一个变量,常数或者本身时,实际操作是它的@H_404_91@拷贝。
let hd = Resolution(width: 1920,height: 1080)
var cinema = hd
因为resolution 是一个结构体,所以cinema的值其实是hd的一个拷贝副本,而不是hd本身,也就是说我们现在改变cinema 的值并不会影响到hd的值。
cinema.width = 2048
print("cinema is now \(cinema.width)'s wide\n") println("hd is now \(hd.width)'s wide")
在将hd赋值给cinema时候,实际上是将hd中所储存的值进行拷贝,然后将拷贝的值存在新的cinema分配的地址中。结果就是两个完全独立的实例,碰巧包含了同样的属性,所以将cinema的值进行改变,不会影响hd中的数值。
枚举类型,也遵循了同样的规规则
enum CompassPoint
{
case North,South,East,West
}
var currentDirection = CompassPoint.West
let rememberDirection = currentDirection
currentDirection = .East
if rememberDirection == .West
{
println("The remember Direction is still West")
}
类是引用类型
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.framRate = 25.0
以上声明了一个名为tenEighty的常量,引用了一个VideoMode类的实例,之前的实例中,hd已经被赋值为1920,1080。
然后我们再声明一个类
let alsoTenEighty = tenEighty
tenEightly 被赋值为alsoTenEighty的心敞亮,同时对频率进行修改
alsoTenEighty.framRate = 30
因为类是引用类型,所以tenEighty和alsoTenEighty实际上引用的是相同的VideoMode实例,也就是他们是同一个实例的两种叫法(引用)
println("The frameRate of tenEighty is \(tenEighty.framRate)")
The frameRate of tenEighty is 30.0
代码清单
import Foundation
struct Resolution {
var width = 0
var height = 0
}//定义一个结构体
//在这个结构体中,两个变量被赋值为0,所以被认为是整型变量
//结构体总是以复制的方式传递dsdddddsf
class VideoMode {
var resolution = Resolution() //分辨率,被初始化成一个Resolution结构体的实例
var interlaced = false
var framRate = 0.0
var name:String? //会被默认赋值为nil,是一个可选类型
}
//声称类和结构体的语法很相似
let someResolution = Resolution()
let someVideoMode = VideoMode()
//这样的初始化方式使得实行均会被初始化成默认值
//下面是属性的访问
//通过使用语法 . 可与你访问实例中所有含有的属性
//例如下面这个
println("The Width Of someResolution is \(someResolution.width)")
//将会输出 “The Width Of someResolution is 0”
//也可以访问子属性,就像这样
someVideoMode.resolution.width = 1920
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
//同样可以输出“The width of someVideoMode is 1920”
//请注意:与Objective-C不同的是,Swift允许直接对结构体属性的子属性,上面的例子就是直接实质了someVideoMode中的resolution的with的值,而这个操作不需要对resolution属性进行重新的设置
//结构体成员的逐一初始化
//所有结构体都有一个自动生成的初始化器
let vga = Resolution(width: 640,height: 480)
//与结构体不同的是,类的实例没有默认成员的逐一初始化器,而由类的构造器来代替相关的工作
//结构体和枚举类型是值类型
//值类型被赋予一个变量,常数或者本身时,实际操作是它的拷贝
let hd = Resolution(width: 1920,height: 1080)
var cinema = hd
//因为resolution 是一个结构体,所以cinema的值其实是hd的一个拷贝副本,而不是hd本身,也就是说我们现在改变cinema 的值并不会影响到hd的值
cinema.width = 2048
print("cinema is now \(cinema.width)'s wide\n")
println("hd is now \(hd.width)'s wide")
//在将hd赋值给cinema时候,实际上是将hd中所储存的值进行拷贝,然后将拷贝的值存在新的cinema分配的地址中。结果就是两个完全独立的实例,碰巧包含了同样的属性,所以将cinema的值进行改变,不会影响hd中的数值。
//而枚举类型,也遵循了同样的规规则
enum CompassPoint
{
case North,West
}
var currentDirection = CompassPoint.West
let rememberDirection = currentDirection
currentDirection = .East
if rememberDirection == .West
{
println("The remember Direction is still West")
}
//类是引用类型
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.framRate = 25.0
//以上声明了一个名为tenEighty的常量,引用了一个VideoMode类的实例,之前的实例中,hd已经被赋值为1920,1080
let alsoTenEighty = tenEighty
//tenEightly 被赋值为alsoTenEighty的心敞亮,同时对频率进行修改
alsoTenEighty.framRate = 30
//因为类是引用类型,所以tenEighty和alsoTenEighty实际上引用的是相同的VideoMode实例,也就是他们是同一个实例的两种叫法(引用)
println("The frameRate of tenEighty is \(tenEighty.framRate)")