http://blog.csdn.net/goohong/article/details/31769677

Swift语言中,具有类特征的类型包括三种,即枚举类型、结构类型(包括基本类型,基本类型实际都是结构类型的特例)、类。其中枚举类型、结构类型是属于值类型,类属于引用类型。三种类型都可以添加属性、方法、下标方法,能够使用扩展进行功能扩展,使用协议等。

一、 枚举

枚举定义了一种包含一组相关值的公共类型。枚举是Swift中的一种与类类似的类型,具有许多传统类才有的特征,例如计算属性、实例方法,能够通过扩展或协议增强功能等。

1.1 枚举定义

Swift 语言的枚举类型的定义语法如下:

enum CompassPoint {

case North

case South

case East

case West

}

枚举语法以一个关键字enum来标识,enum后面包含一个枚举类型名字,枚举定义全部放到一对大括号中。

在枚举中定义的值称为枚举成员值,用case关键字来指示一个新的枚举成员值。

与C和Objective-C语言的枚举类型不同的是:在Swift中不需要为枚举成员分配一个默认的整数值。

如果为枚举成员提供值,该值可以是一个字符串、一个字符或者是一个任意整数或浮点数。

枚举成员值可以定义到一行中,并用逗号分割。

enum Planet {

case Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune

}

每个新定义的枚举都属于一种新的独立的类型。

1.2 枚举的使用

可以为一个常量或变量分配一种枚举类型的值,如:

var directionToHead =CompassPoint.West

以上定义的变量directionToHead可以推断为是一种CompassPoint类型的枚举变量,因此你可以设置该变量为CompassPoint类型的其它值,如:

directionToHead = .East //枚举类型被省略

枚举也能够在switch语句中使用,用来匹配独立的枚举值:

directionToHead = .South

switch directionToHead {

case .North:

println("Lots of planets have a north")

case .South:

println("Watch out for penguins")

case .East:

println("Where the sun rises")

case .West:

println("Where the skies are blue")

}

1.3 为枚举成员分配相关值

Swift中能够为每一个枚举成员规定一个任意类型的相关值,并且为每个枚举成员规定的相关值的类型可以不同。

enum Barcode {

case UPCA(Int,Int,Int)

case QRCode(String)

}

该例子定义了一个类型为Barcode的枚举类型,并定义了两个枚举值UPCA 和QRCode,并可以为枚举值UPCA分配一个多元组类型的相关值,为QRCode分配一个字符串类型的相关值,该例子没有为枚举值本身指定任何类型的值。

可以使用以上定义的枚举为一个常量或变量赋值,如:

var productBarcode =Barcode.UPCA(8,85909_51226,3)

该例子为变量 productBarcode分配了一个Barcode.UPCA枚举值,为其分配的相关的多元组类型的值为(8,85909_51226,3)。

然后该变量productBarcode可以设置为带字符串类型相关值的另外的一个枚举值:

productBarcode = .QRCode(“ABCDEFGHIJKLMNOP”)

还可以在switch语句中使用该枚举,并通过绑定常量或变量的方式引出其带有的相关类型的值:

switch productBarcode {

case .UPCA(let numberSystem,let identifier,let check):

println("UPC-A with value of\(numberSystem),\(identifier),\(check).")

case .QRCode(let productCode):

println("QR code with value of\(productCode).")

}

如果枚举成员的所有的相关值都作为常量被引出,或者所有的相关值都作为变量形式被引出,以上语法还可以简写为如下形式:

switch productBarcode {

case let .UPCA(numberSystem,identifier,check):

println("UPC-A with value of\(numberSystem),\(identifier),\(check).")

case let .QRCode(productCode):

println("QR code with value of\(productCode).")

}

1.4 为枚举分配原始值

除了为枚举成员分配相关的值外,还能为每个枚举成员预分配一个同类型的原始值。这与C 语言为枚举成员分配一个整数值类似,但Swift定义的原始值的类型可以是字符串、字符、或任意的整数或浮点数类型等,如:

enum ASCIIControlCharacter:Character {

case Tab ="\t"

case LineFeed ="\n"

case CarriageReturn ="\r"

}

该例子中,定义了一个含有三个枚举成员的枚举类型ASCIIControlCharacter,并指定其原始类型为字符类型,并为每个枚举成员分配一个字符类型的默认原始值。

与C语言为枚举成员指定值类似,Swift要求为枚举的每个枚举成员分配的原始值必须在枚举声明内唯一。当使用整数类型的原始值时,枚举成员的其它原始值如果没有指定,其能够在第一个枚举成员定义值的基础上自动加1,如下所示:

enum Planet:Int {

case Mercury =1,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune

}

为枚举成员定义的原始值与为枚举成员分配的相关值不同,枚举成员的原始值是在枚举第一次定义时被分配的,而枚举成员的相关值虽然其类型也是在枚举定义时指定,但其值是在使用枚举类型创建一个常量或变量时设置的。

在Swift中,能够使用枚举成员的toRaw方法来获取枚举成员的原始值:

let earthsOrder = Planet.Earth.toRaw()

相反,也可以使用枚举类型的fromRaw方法来返回对应原始值的枚举成员,该方法返回的是一个选项,因为其值可能存在也可能不存在。如下所示。

let possiblePlanet =Planet.fromRaw(9)

// 返回对应原始值为9的枚举Planet的枚举成员。返回的是一个Planet? 选项类型,在例子所示情况下该值不存在,返回的是一个nil。

二 结构与类

2.1 两者比较

在Swift中,结构和类功能上几乎相同,两者都具有如下相同的功能:

1) 可以定义属性,用来存储值;

2) 可以定义方法,用来提供功能;

3) 可以定义一个脚本方法,用来使用脚本语法来存取它们的值;

4) 能够定义初始化方法来设置它们的初始状态;

5) 能够扩展来增加原先没有实现的功能;

6) 能够遵从相关协议来提供确定类型的标准功能。

类在以下方面与结构存在差别:

1) 类能够继承,一个类能够继承它的超类的特性,而结构不能继承;

2) 类允许在运行时检查和解释一个类实例的类型;

3) 类可以带有析构函数,允许类的实例释放它所分配的任何资源;

4) 引用计数允许一个类实例有多个引用。

5) 结构在代码中总是以复制方式来传递,而不使用引用计数。

2.2 类和结构的定义和实例化

类和结构的定义采用相似的语法,类使用class关键字来指示,结构使用struct关键字来指示。

struct Resolution {

var width =0

var height =0

}

class VideoMode {

var resolution =Resolution()

var interlaced =false

var frameRate =0.0

var name:String?

}

每个新定义的类或结构都定义了一种新的类型。

上面例子定义了一种称作Resolution的新的结构类型,其中包含和定义了两个变量类型的属性。还定义了一个称作VideoMode的新类,该类定义和包含四个变量类型的属性,其第一个属性resolution还使用了刚刚定义的结构Resolution的实例进行了初始化。

类和结构中定义的变量或常量类型的属性像通常变量和常量一样进行初始化和赋值,属性的类型可以根据为其提供的初始值进行推断。

为类和结构创建实例的语法相同:

let someResolution =Resolution()

let someVideoMode =VideoMode()

该例子采用了结构和类初始化最简单的语法形式(结构和类的类型名面跟着一对圆括号)。该初始化语法为结构和类创建了一个新的各自的实例,并赋值给两个常量,两个实例的属性也在该初始化方法中被初始化为它们的默认值。

在Swift中,所有的结构类型都会自动产生一个参数初始化方法,可以使用该方法来初始化和创建结构的新的实例及其成员属性,新创建实例的属性的初始值使用该初始化方法的参数传进来的值,如:

let vga =Resolution(width:640,height:480)。

而类没有提供相对应的默认的参数初始化方法。

在Swift中,与脚本语言类似,可以使用点语法的形式来存取一个结构或类实例的属性以及子属性,即读取和设置其值:

读取属性的值:

println("The width of someResolution is\(someResolution.width)”)

println("The width of someVideoMode is\(someVideoMode.resolution.width)”)

设置一个属性的值:

someVideoMode.resolution.width = 1280

2.3  结构、类与枚举的类型

在Swift中,结构和枚举与其它基本类型(整型、浮点类型、布尔类型、字符串、数组和词典,这些类型其实都是以结构类型实现的)一样属于值类型。这意味着它们在分配给一个变量或常量时或当它作为参数传送给一个函数时,它们的实例以及它们包含的所有作为值类型的属性一一被拷贝。

在Swift中,为了提供性能,拷贝采用延迟拷贝的机制,即在实际用到时才拷贝。

let     hd = Resolution(width:1920, height:1080)

var cinema =hd

在该例子中,由于Resolution是一个结构类型,因此常量hd和变量cinema属于Resolution结构类型的不同实例,因为在为变量cinema赋值时发生了拷贝行为。

与结构和枚举不同,类的类型属于引用类型。引用类型的实例在分配给一个变量或常量时或当它作为参数传送给一个函数时,没有拷贝发生。

let tenEighty =VideoMode()

tenEighty.frameRate = 25.0

let alsoTenEighty =tenEighty

alsoTenEighty.frameRate =30.0

由于VideoMode属于类,因此现在两个常量tenEighty和alsoTenEighty引用的是相同的VideoMode实例,只是对应相同实例的不同的名字,因此这两个常量的属性值frameRate现在都等于30.0。

注意上面的tenEighty和alsoTenEighty被声明为两个常量,而不是变量,这是因为tenEighty和alsoTenEighty本身存储的只是VideoMode的实例的引用值,而不是VideoMode实例本身,因此你通过它们对引用的类实例的属性的改变,改变是类实例本身的属性,而不是引用本身。

由于类是引用类型,就如以上例子所示,多个变量或常量可能引用一个类的相同的实例。为了判断两个常量或变量是否引用的是一个类的相同实例,Swift提供了两个引用比较操作符: ‘===’与 ‘!==’。可以使用这两个操作符来检查两个常量或变量是否引用的是相同的实例:

if tenEighty ===alsoTenEighty {

println("tenEighty and alsoTenEighty refer to the same Resolution instance.")

}

在Swift中,一个常量或变量引用一个类的实例,这与C语言中的指针类似,但在Swift 中,引用不是直接指向内存中一个地址,因此不需要使用C语言中类似的指针符号’*’,用来代表一个引用或指针。

版权所有,请转载是清楚注明链接和出处,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/xuejinhui/p/4618118.html

苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类相关推荐

  1. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  2. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  3. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  4. 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套

    一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...

  5. A Swift Tour, 苹果新推出的开发语言

    苹果近日召开了全球开发者大会(WWDC),推出了一种新的开发语言 Swift,有人说是用来替代Objective-C的,以下是苹果官方文档,第一时间整理了一下,觉得还是很有前景的,有些英文看不懂的就直 ...

  6. 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  7. playgrounds能运行c语言吗,儿童学编程语言 swift语言playgrounds第一课

    swift playgrounds 编程界面 但是包括scratch在内的其他多数的儿童学习软件,基本都没有接触到代码层面,主要还是学习的是编程思维,转而学习真正的编程语言比如python时,还是要从 ...

  8. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  9. 初探swift语言的学习笔记四(类对象,函数)

    2019独角兽企业重金招聘Python工程师标准>>> swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱 ...

  10. 苹果编程语言Swift解析:将推动应用开发巨变

     苹果编程语言Swift解析:将推动应用开发巨变     以下为文章全文: 许多人可能都已忘记苹果WWDC中的"D"代表了"开发者".这是一次开发者的大会, ...

最新文章

  1. 【论文理解】ArcFace: Additive Angular Margin Loss for Deep Face Recognition(InsightFace)
  2. 怎样才能去掉图片锁定纵横比_1分钟批量统一Word中300张图片的大小!无需插件、代码,超级简单...
  3. [Java基础]比较器排序Comparator的使用
  4. 5个常见的Hibernate异常及其解决方法
  5. 如何在vba中实现目录浏览对话框
  6. mysqldump导出数据库视图_mysql中如何用mysqldump批量如何导出视图view啊?
  7. JavaTutorialNetwork 中文系列教程 · 翻译完成
  8. 感觉养老金越涨差距越大,有人提议高于5000的不再上涨,合理吗?
  9. 网管日志-06.08.16
  10. Mybaits的运行原
  11. R语言常用数据文件的导入
  12. mysql 统计函数 双条件_使用COUNTIFS函数统计符合多个条件的单元格的方法
  13. loadlibrary函数失败,错误码:126
  14. excel取消隐藏_Excel教程:一键取消隐藏工作表
  15. halcon小例:ORC识别
  16. 【吐血整理】一份完备的集成学习手册!(附Python代码)
  17. 6只做化验用的玻璃杯,前面3只盛满了水,后面3只是空的。你能只移动1只玻璃杯,就便盛满水的杯子和空杯子间隔起来吗?
  18. 11种QQ技术 ,让你成为QQ高手
  19. samba服务器介绍
  20. 数字经济新基建巨头:VMware公司研究

热门文章

  1. Linux下通过HostName访问主机以及修改HostName方法
  2. 时隔两年,PuTTY 喜提新版
  3. 升级glibc库到glibc-2.14.1
  4. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...
  5. Android学习目录
  6. webpack2终极优化
  7. 研究预测2022年全球VoLTE市场规模达348亿美元
  8. 信息系统开发平台OpenExpressApp - ClickOnce智能部署
  9. Ubuntu使用记录:安装deb软件方法以及apt、apt-get和dpkg的区别
  10. 安卓apk的编译与反编译