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)")
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值