Swift基础(五):类和结构体
2016-06-04 10:01
323 查看
目录:
类和结构体初始化
类是引用类型
恒等运算符
指针
类和结构体的选择
字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
//类和结构体初始化
struct ResolutionStruct//结构体
{
var width = 0;
var height = 0;
}
class ResolutionClass//类
{
var width = 0;
var height = 0;
}
let vgaStruct = ResolutionStruct(width:640, height:
480);//结构体初始化赋值
let vgaClass =
ResolutionClass();//类初始化赋值
vgaClass.height =
560;
vgaClass.width =
480;
//类是引用类型
//与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。而是引用已存在的实例。
class VideoMode
{
var interlaced =
false;
var frameRate =
0.0;
var name: String?;
}
let tenEighty = VideoMode();
tenEighty.interlaced =
true;
tenEighty.name =
"1080i";
tenEighty.frameRate =
25.0;
let alsoTenEighty =
tenEighty;//alsoTenEighty引用tenEighty
alsoTenEighty.frameRate =
30.0//改变alsoTenEighty的值,tenEighty的值一样改变
print("The frameRate property of tenEighty is now
\(tenEighty.frameRate)");//输出:30.
//恒等运算符:三个等号"==="等价于,不等价于“!==”
var videoMode1 = VideoMode();
var videoMode2 = videoMode1;
if(videoMode1 ===
videoMode2)
{
print("等价于");
}
//指针
//类和结构体的选择
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
•
该数据结构的主要目的是用来封装少量相关简单数据值。
•
有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。 •
该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
•
该数据结构不需要去继承另一个既有类型的属性或者行为。
举例来说,以下情境中适合使用结构体:
•
几何形状的大小,封装一个 width
属性和 height
属性,两者均为 Double
类型。 •
一定范围内的路径,封装一个 start
属性和 length
属性,两者均为 Int
类型。 •
三维坐标系内一点,封装 x , y
和 z
属性,三者均为 Double
类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的
自定义数据构造都应该是类,而非结构体。
//字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift
管理所有的值拷贝以确保性能最优化,所以你没必要去回
避赋值来保证性能最优化。
类和结构体初始化
类是引用类型
恒等运算符
指针
类和结构体的选择
字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
//类和结构体初始化
struct ResolutionStruct//结构体
{
var width = 0;
var height = 0;
}
class ResolutionClass//类
{
var width = 0;
var height = 0;
}
let vgaStruct = ResolutionStruct(width:640, height:
480);//结构体初始化赋值
let vgaClass =
ResolutionClass();//类初始化赋值
vgaClass.height =
560;
vgaClass.width =
480;
//类是引用类型
//与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。而是引用已存在的实例。
class VideoMode
{
var interlaced =
false;
var frameRate =
0.0;
var name: String?;
}
let tenEighty = VideoMode();
tenEighty.interlaced =
true;
tenEighty.name =
"1080i";
tenEighty.frameRate =
25.0;
let alsoTenEighty =
tenEighty;//alsoTenEighty引用tenEighty
alsoTenEighty.frameRate =
30.0//改变alsoTenEighty的值,tenEighty的值一样改变
print("The frameRate property of tenEighty is now
\(tenEighty.frameRate)");//输出:30.
//恒等运算符:三个等号"==="等价于,不等价于“!==”
var videoMode1 = VideoMode();
var videoMode2 = videoMode1;
if(videoMode1 ===
videoMode2)
{
print("等价于");
}
//指针
//类和结构体的选择
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
•
该数据结构的主要目的是用来封装少量相关简单数据值。
•
有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。 •
该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
•
该数据结构不需要去继承另一个既有类型的属性或者行为。
举例来说,以下情境中适合使用结构体:
•
几何形状的大小,封装一个 width
属性和 height
属性,两者均为 Double
类型。 •
一定范围内的路径,封装一个 start
属性和 length
属性,两者均为 Int
类型。 •
三维坐标系内一点,封装 x , y
和 z
属性,三者均为 Double
类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的
自定义数据构造都应该是类,而非结构体。
//字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift
管理所有的值拷贝以确保性能最优化,所以你没必要去回
避赋值来保证性能最优化。
相关文章推荐
- 听说Swift很NB,那么来勉强学点(3.3)--集合类型字典Dictionary
- swift学习之路(十)字典
- swift学习之路(九)数组
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
- NSUserDefaults.standardUserDefaults().boolForKey
- OC与swift相互调用
- iOS 的用户认证:使用Swift和Ruby on Rail
- 今天开始学习swift
- Swift开篇012->构造过程
- Swift开篇011->继承
- 从oc到swift
- swift - String 取子串、插入,替换,删除
- swift用xib 自定义View
- Swift iOS中的Nullability Annotations
- swift2.0 学习笔记Fourteen
- 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
- Swift语言如何获取类型的大小?
- Swift中for循环的递减操作实现
- XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)
- 听说Swift很NB,那么来勉强学点(3.1)--集合类型数组