swift学习笔记之-类和结构体

//类和结构体

 

import UIKit

 

//类和结构体

/*

1.枚举enum、结构体struct和String、Array、Dictionary类型,都属于值传递类型,被赋值给新的常量或变量时传递的是值的拷贝,若声明为常量实例,则不能修改它的属性的值,即使属性为变量

2.类class是引用类型,被赋值时传递的是实例的引用

一、类和结构体对比

Swift 中类和结构体有很多共同点。共同处在于:

    定义属性用于存储值

    定义方法用于提供功能

    定义附属脚本用于访问值

    定义构造器用于生成初始化值

    通过扩展以增加默认实现的功能

    实现协议以提供某种标准功能

 

与结构体相比,类还有如下的附加功能:

    继承允许一个类继承另一个类的特征

    类型转换允许在运行时检查和解释一个类实例的类型

    解构器允许一个类实例释放任何其所被分配的资源

    引用计数允许对一个类的多次引用

 

二、按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:

    1.该数据结构的主要目的是用来封装少量相关简单数据值。

    2.有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。

    3.该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。

    4.该数据结构不需要去继承另一个既有类型的属性或者行为。

*/

//结构体、类的定义

struct Resolution {

    var width = 0

    var height = 0

    var filename = "data.txt"

}

class VideoMode {

    lazy var 延迟属性 = Resolution()        //在实例初始化时未创建,只有在被调用时才创建

    var resolution = Resolution()

    var interlaced = false

    var frameRate = 0.0

    var name:String?

}

let someresolution = Resolution()

let somevideomode = VideoMode()    //实例的属性值均为默认值

let vga = Resolution(width: 1024, height: 768, filename:"file.txt")  //构造体类型有成员逐一构造器,用于初始化新实例中的属性值,而类实例无默认的成员逐一构造器!

//vga.width = 768  构造体类型的常量实例不能修改其任何属性的值

var hd = vga    //hd的值为vga的值的拷贝,改变hd的值与vga无关,他们是不同的结构体实例

hd.width = 1920

print("hd=\(hd.width)  vga=\(vga.width)")

let one = somevideomode    //类的常量实例的属性可以更改,因为更改的是所引用的实例的属性的值,而非引用本身

one.resolution = hd

one.interlaced = true

one.frameRate = 25.0

one.name = "1920i"

let two = one

two.resolution.width = 2880  //可以访问实例属性的子属性

if two === one {               //(===,!== 等阶于,不等阶于,one和two引用同一实例)

    print("one的子属性width值=\(one.resolution.width)  two的子属性width值=\(two.resolution.width)")

    print("开始调用文件:\(two.延迟属性.filename)")   //延迟属性:在实例初始化时未创建,只有在被调用时才创建,(前面加“lazy”关键字)

}

 

转载于:https://www.cnblogs.com/susufufu/p/5705576.html

  • 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、付费专栏及课程。

余额充值