swift:入门知识之枚举和结构体

时间:2023-02-14 00:03:35

枚举:

swift中的枚举有些类似于类这个概念,它有自己的属性,也可以有自己的方法

枚举中的成员有原始值和实际值之分,原始值用来枚举成员的排序次序,默认从0开始

枚举出来的成员值就是实际值

可以通过toRaw和fromRaw函数转换原始值和枚举值

也可以使用字符处或浮点数作为枚举的原始值

枚举:

swift:入门知识之枚举和结构体

匹配枚举值和Switch语句(Matching Enumeration Values with a Switch Statement)

swift:入门知识之枚举和结构体

具体举例如下:

//给扑克牌内容声明一个枚举(A、2、3、4、5、6、7、8、9、10、J、Q、K)

enum Rank:Int{
case Ace
case Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten
case Jack,Queen,King func simpleDescription()->String{
switch self{
case .Ace:return "ace"
case .Jack:return "Jack"
case .Queen:return "Queen"
case .King:return "King"
default:return String(self.toRaw())
}
}
}

//创建枚举实例,获取枚举元素的原始值和实际值

let ace = Rank.Jack   //获取一个枚举元素
let originValue = ace.toRaw() //该元素的原始值 10
let factvalue = ace.simpleDescription() //该元素的实际值 Jack //将一个原始值转换为实际值
if let origin = Rank.fromRaw(){ //
let fact = origin.simpleDescription() // Jack
}

//给扑克牌的花色声明一个枚举

enum Suit{
case Spades,Hearts,Diamonds,Clubs
func simpleDescription()->String{
switch self{
case .Spades : return "spades"
case .Hearts : return "hearts"
case .Diamonds:return "diamonds"
case .Clubs : return "clubs"
}
}
}

//创建枚举实例,获取枚举元素的值

let heart = Suit.Hearts   //获取一个枚举元素
let heartsDescription = heart.simpleDescription() //元素的实际值 hearts

结构体:

swift中使用struct创建结构体。结构体支持多个与类相同的行为,包括方法和构造器。

一大重要的区别是结构体(以及枚举)代码之间的传递总是用拷贝(值传递),而类则是传递引用(地址传递)。

对于传值调用,是把实参户值传递给形参,此时形参是要被分配空间的,而对形参做的任何操作是不会改变实参的值的;

对于传址调用,是指传递实参的地址,即形参和实参的指针指向同一块内存区域,任何一方对数据做修改,值都会改变。

类和结构体对比

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

定义属性用于储存值

定义方法用于提供功能

定义下标用于通过下标语法访问值

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

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

符合协议以对某类提供标准功能

swift:入门知识之枚举和结构体

//结合上面的枚举的使用,现在声明一个扑克牌结构体,它有扑克牌内容和花色这两个枚举类型的成员变量

struct Card {

    //成员属性
var rank:Rank
var suit:Suit //成员方法
func simpleDescription()->String{
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}

//创建结构体成员实例,并调用成员方法

//传入两个枚举类型的引用创建一个结构体成员变量
let threeOfShapes = Card(rank: .Three, suit: .Spades) //结构体成员变量调用成员方法
let threeOfShapesDescription = threeOfShapes.simpleDescription() //“The 2 of shpades”

总结:结构体和枚举是值类型

值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝。

在之前的章节中,我们已经大量使用了值类型。实际上,在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。

在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。

swift:入门知识之枚举和结构体的更多相关文章

  1. Swift具体解释之六----------------枚举、结构体、类

    枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...

  2. C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

    1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) ...

  3. Swift中文教程(六)--枚举和结构

    原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). enu ...

  4. c#之枚举,结构体

    1.枚举 2.结构体 例子1: using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  5. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  6. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  7. Swift基础语法(五)枚举、结构体与类的区别

    swift中的结构体值可以是整型.浮点型.字符串.字符.元祖,如果不赋值默认为整型且从0开始计数,如果为整型枚举且要求不是从0开始只需指定枚举的第一个值以后的值自动依次加1 引用方式也与oc有所出入 ...

  8. swift学习笔记之---数组、字典、枚举、结构体

    1.数组-Array let types = ["none","warning","error"] //省略类型的数组声明 let menb ...

  9. Swift学习——A Swift Tour 枚举和结构体

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/28588095 Enumerations ...

随机推荐

  1. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  2. Oracle日期时间函数大全

    ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...

  3. 因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 。。。

    因为相同类型的其他实体已具有相同的主键值.在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified&quo ...

  4. JVM探索之——内存管理(一)

    本系列的第一篇文章,预计本系列最后面会有两三个案例. Java与C.C++不一样Java不需要Coder进行手动内存管理,而这一切都交给JVM进行自动内存管理,这从某种程度上来说也减轻了我们Coder ...

  5. 关于Cygwin的x-Server的自动运行以及相关脚本修改

    常常需要用到远端服务器的图形工具,如果在windows端没用xserver的话,很多程序无法运行.一个特殊的例子,emacs在没用xserver的时候,是直接在终端中打开的,如果不修改cygwin.b ...

  6. Cocos2d-x C++调用Android弹出提示框

    转载请注明地址,谢谢.. Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作. (PS:弄了一天想自己写代码操作Jni的,但是总是出错,技术差不得不使用Cocos2d-x现成的 ...

  7. freemarker常用值格式化方法

    freemarker常用的值格式化方法: 1.${price?string('0.00')} 对price进行格式化,小数点后不足2位用0补足. 比如:price=1 输出:1.00 2.${pric ...

  8. 【XAF问题】多个属性验证RuleUniqueValue

    一.问题 1. 在XAF中如何验证多个属性唯一值? 二.解决方法 使用RuleCombinationOfPropertiesIsUnique [RuleCombinationOfPropertiesI ...

  9. 【Python】SciKit-Learn包安装问题

    pip install scikit-learn 如果失败的话,可以考虑直接升级pip 我原先的pip版本是10.0.1 安装失败 升级pip到18.1后,在安装就成功了

  10. vb.net ping

    Function ping(ByVal IP As String) As String If My.Computer.Network.Ping(IP) Then MessageBox.Show(&qu ...