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”

请注意:与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,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,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)")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 中的结构体(struct)都是用来封装数据和方法的型,但它们有一些区别。 1. 继承:支持继承(inheritance),可以继承其他的特性,而结构体不支持继承。 2. 引用型和值型:是引用型(reference type),结构体是值型(value type)。当你创建一个的实例并将其分配给变量或常量时,这个变量或常量实际上是对实例的引用。而当你将一个结构体分配给变量或常量时,这个变量或常量会包含该结构体的副本。因此,当你对引用型进行操作时,对该型的所有引用都会受到影响。而对于值型,每个实例之间是独立的,操作一个实例不会影响其他实例。 3. 构造函数:有自己的构造函数(initializer),而结构体的构造函数是自动生成的。在中,你可以指定一个或多个构造函数来初始化的实例。但是结构体的构造函数是根据结构体的属性自动生成的,你也可以自定义结构体的构造函数。 4. Deinitializer:有自己的析构函数(deinitializer),而结构体没有析构函数。 5. 内存管理:Swift 中的使用引用计数(reference counting)来管理内存,而结构体则是在栈上分配内存。由于引用型是在堆上分配内存,所以需要更多的内存管理,包括对象引用计数的增加和减少等操作。 总之,结构体都有其自己的优缺点,根据实际情况选择使用哪种型来封装数据和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值