Swift结构体和类

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)")

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...