在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
//类和结构体
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”关键字) }
|
请发表评论