热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习Swift笔记(九)枚举

·枚举语法·匹配枚举值与Switch语句·相关值·原始值枚举定义了一个通用类型的一组相关的值,是你可以在你的代码中以一个安全的方式来使用这些&#

·枚举语法

·匹配枚举值与Switch语句

·相关值

·原始值



枚举定义了一个通用类型的一组相关的值,是你可以在你的代码中以一个安全的方式来使用这些值。

Swift只能中不必给每一个枚举成员提供一个值。

提供给每个枚举成员的可以是一个字符串,一个字符,或是一个整型值或浮点值。

此外,枚举成员可以指定任何类型的相关值存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为枚举的一部分,每一组都有不同的一组与它相关的适当类型的值。


在Swift中,枚举类型是一等类型(first-class)。他们采用了很多传统上只被类(class)所支持的特征,例如计算型属性(computed properties),用于提供关于枚举当前值的附加信息;实例方法(instance methods),用于提供和枚举所代表的值相关联的功能;枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。


·枚举语法

使用enum关键字并且把它们的整个定义放在一对大括号内。

enum SomeEnumeration{
// enumeration definition goes here
}


enum CompassPoint{
case North
case South
case East
case West
}

一个枚举中被定义的值(例如North)是枚举的成员值(成员)。case关键词表名新一行成员值将被定义。


注意:与C/OC不一样的是,Swift的枚举成员在被创建时不会被赋予一个默认的整数值。

多个成员值可以出现在同一行上,用逗号隔开:

enum Planet{
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
}
每个枚举定义了一个全新的类型。像Swift中其他类型一样,必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字。

enum CompassPoint{
case North
case South
case East
case West
}
var directiOnToHead= CompassPoint.West
directionToHead的类型被推断当它被CompassPoint的一个可能值初始化。一旦directionToHead被声明为一个CompassPoint,你可以使用更短的点(.)语法将其设置为另一个CompassPoint的值:

var directiOnToHead= CompassPoint.West
directiOnToHead= .North
directionToHead的类型已知时,当设定它的值时,你可以不在写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。





·匹配枚举值和Switch语句


你可以匹配单个枚举值和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")
}
// 输出 "Watch out for penguins”

当考虑一个枚举的成员们时,一个switch语句必须全面。如果忽略了.west这种情况,代码就将无法通过编译。

当不需要匹配每个枚举成员的时候,你可以提供一个默认default分支来涵盖所有未明确被提出的任何成员:

enum Planet{
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
}
let somePlanet = Planet.Earth
switch somePlanet{
case .Earth:
println("Mostly harmless")
default:
println("Not a safe place for humans")
}
//Mostly harmless

·相关值(Associated Values)

为Planet.Earth设置一个常量或者变量,并且在以后查看这个值。如果能够把其他类型的相关值和成员值一起储存起来会很有用。这能让你存储成员值之外的自定义信息,并且当你每次在代码中使用改成员时允许这个信息产生变化。

你可以定义Swift的枚举储存任何类型的相关值,如果你需要的话,每个成员的数据类型可以是各不相同的。枚举的这个特性跟其他语言中的可辨识联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。

enum Barcode{
case UPCA(Int, Int, Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909_51226,3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")


可以在switch的case分支代码中提取每个相关值作为一个常量(用let前缀)或者作为一个变量(用var前缀)来使用:

enum Barcode{
case UPCA(Int, Int, Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909_51226,3)
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).")
}
//UPC-A with value of 8,8590951226,3.

如果一个枚举成员的所有相关值被提取为常量,或者他们全部被提取为变量,为了简洁,你可以只放置一个var或者let标注在成员名称前:

enum Barcode{
case UPCA(Int, Int, Int)
case QRCode(String)
}
var productBarcode = Barcode.QRCode("ABCDEFGHIJKLMNOP")
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).")
}
//QR code with value of ABCDEFGHIJKLMNOP.


·原始值(Raw Values)

作为相关值的代替,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。

例子:一个枚举成员存储原始ASCII值。

enum ASCIIControlCharacter: Character{
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
在这里,称为ASCIIControlCharacter的枚举的原始值类型被定义为字符型Character,并被设置了一些比较常见的ASCII控制字符。

注意:原始值和相关值是不相同的。

对于一个特定的枚举成员,它的原始值始终是相同的。相关值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做的时候,他的值可以是不同的。

原始值可以是字符串,字符或者任何整型值或浮点型值。每个原始值在它的枚举声明中必须是唯一的。当整型值被用于原始值,如果其他枚举成员没有值时,他们会自动递增。

enum Planet: Int{
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
}

使用枚举成员的toRaw方法可以访问该枚举成员的原始值:

enum Planet: Int{
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
}
let earthsOrder = Planet.Earth.toRaw()
println(earthsOrder)
//3


使用枚举的fromRaw方法来试图找到具有特定原始值的枚举成员:

let possiblePlanet = Planet.fromRaw(7)
然而,并非所有可能的Int值都可以找到一个匹配的行星。fromRaw方法可以放回一个可选的枚举成员。

enum Planet: Int{
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn
}

let positiOnToFind= 9
if let somePlanet = Planet.fromRaw(positionToFind){
switch somePlanet{
case .Earth:
println("Mostly Harmless")
default:
println("Not a safe for humans")
}
}else{
println("There is not a planet at position \(positionToFind)")
}
//There is not a planet at position 9
















推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
author-avatar
HGKHGK
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有