swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念
***************可为空的类型
var demo2 :we_demo = nil
上面这个代码串的语法是错的
为什么呢,
在Swift中,所有的类型定义出来的属性的默认值都不可以是nil
不管是普通简单值类型还是引用类型
那我就是要让这个属性默认值为空,为nil
怎么办呢,很简单,用语法,在定义这个属性的时,在类型后面声明一个?
这样就表示这个属性除了指定类型的默认值外还可以是一个可为空的类型
在Java中,最常见的错误类型就是NullPoinExecption,
为什么就是要有Null这么一个属性来给属性赋值一个空值呢
Java中的属性在定义好后
Value值可能是一个不确定的,不具体,不切实际的那么一个数据
所以,在Java中,定义属性是会给一个初始值Null
在后面再来赋予一个新Value值
可以为空的类型
定义属性的类型后加?,表示该属性是可为空的类型属性
swift代码:
var zsName :String? = nil
zsName = "外星人"
zsName = "1002"
zsName = nil
zsName = "火星人"
zsName
zsName = nil
zsName = "李四"
zsName!
if let d = zsName{
print(d)
}
定义属性时在类型后加?,表示属性的默认值可以为空nil
在Swift中的nil可为空类型,是包装而来的
swift给这个类型做了一个包装
在使用该属性时,要让该属性和nil分离开来
使用默认值可为空的属性时,在属性的后面加!
***************枚举
枚举的定义是可以有类型的
定义一个枚举Color
swift代码:
enum Color :String{
case Red
case Blue
case Green
}
定义一个常量保存一个case
swift代码:
let color = Color.Green
使用Switch来进行多分支判断
判断这个情况在Color美剧中是否存在
存在就做相应操作
swift代码:
switch color {
//在Color枚举中,
//定义了3中情况
//分别是Red Blue Green
//判断color是否是Color枚举中的Red
case .Red:
print("红色")
//判断color是否是Color枚举中的Green
case .Green:
print("绿色")
//默认的情况
default:
print("没有")
/*
Color枚举中是有保存3种情况的
在以上switch判断中只列举了2种来进行判断
所以,在判断体中就必须要有一个默认
*/
//若不想指定一个默认
//将枚举Color中的3中情况全部列举出来进行判断
// case .Red:
// print("红色")
// case .Green:
// print("绿色")
// case .Blue:
// print("蓝色")
}
***************枚举原生值(rawValue)////////////
rawValue关键字
使用rawValue关键字进行枚举原生值得操作
PS 原生值得操作的前提,该枚举必须是String 和 Int类型的才可以
swift代码:
//定义一个枚举Score
enum Score :Int{
case a
case b
case c
}
//访问枚举Score
let Score_a = Score.init(rawValue: 0)
let Score_b = Score.init(rawValue: 1)
let Score_c = Score.init(rawValue: 2)
Score.init(rawValue: 6)
/*
小结:
上面代码的练习中,枚举的情况原生值得初始值是0
调用枚举的init方法,传递一个枚举原生值,可以拿到该原生值在枚举中对应的情况
PS 调用枚举enum的方法init,若传递的原生值rawValue在枚举中对应的情况是未定义
init方法返回nil
*/
Int类型的枚举原生值的默认初始值得0
原生值是可以自定义的
下面代码练习String类型的枚举
swift代码:
//定义枚举Class
enum Class :String {
case name = "Tom"
case age
}
//访问并操作枚举Class
Class.name.rawValue
Class.init(rawValue: "name")
Class.init(rawValue: "age")
Class.init(rawValue: "sex")
/**************************************************
总结:
1>
Int类型、String类型的枚举才有原生值
并且,原生值有初始值,
Int类型的枚举原生值初始值是0
String类型的枚举原生值初始值,枚举中定义的case是什么,枚举原生值的初始值就是什么
2>
但是,枚举原生值有初始值,
初始值也可以自己定义
case caseName = 123
case caseName = "zs"
条件名后用等号来给枚举case指定自定义原生值
PS 枚举是什么类型,自定义枚举case原生值就是什么类型
3>
枚举的使用
enumName.caseName,[获取枚举中的case]
enumName.caseName.rawValue,[获取枚举case的原生值]
enumName.init(rawValue :"")
enumName.init(rawValue :2333)[获取枚举原生值对应的case]
**************************************************/
*******************枚举关联值///
定义一个枚举Student
swift代码:
enum Student {
case name(String)
case age(Int)
case sex(String)
case test(String,Int)
}
//操作使用Student这个枚举
Student.name("Tom")
Student.age(21)
Student.sex("妖")
/***********************************************************
在枚举中,每一个case都可以有关联值,并且关联值可以有多个,类型可以是不一样
用小括号来指定,指定关联值的类型
***********************************************************/
**************************************超级重点来了
**********************************递归枚举///
先来一个测试
学什么都好,先弄一个入门的先搞定它的意思
后面的就不难了
Action>>>
定义一个简单的递归枚举
//语法:若定义的枚举是一个递归枚举,需要在定义递归时的关键字前使用indirect关键字
//indirect关键字是用来标识当前枚举是一个递归枚举
/*
递归特点:
自己调用自己
*/
swift代码:
indirect enum recurrenceEnum{
case a(String)
case d(Int)
case t(recurrenceEnum)
}
//使用这个递归枚举
recurrenceEnum.a("我是递归枚举的case_a")
recurrenceEnum.d(21)
recurrenceEnum.t(recurrenceEnum.a("自己调用自己"))
/***********************************************
要想真正弄懂并且熟练这个递归枚举
IT技术<树>的概念很重要很重要,只要弄懂这个<树>
递归枚举这个知识点只需要3分钟!!
<树>
用简单的话来解释:
自己[一个父亲,一个母亲]
父亲[父亲的父亲,父亲的母亲]
母亲[母亲的父亲,母亲的母亲]
一直往上追溯
这就是树
更简洁的话来描述:
计算机领域,树只有一个根节点,且必须有一个根节点,否则就变成“图”这种数据结构
***********************************************/
定义一个枚举,自己调用自己
写一个可以用来表示运算的枚举
注意,这是一个递归枚举,
使用indirect关键字
swift代码:
indirect enum Operation{
case num(Int)
case additive(left :Operation,right :Operation)
case multiplication(left :Operation,right :Operation)
}
//5 * (3+9)
//5
let exp5 = Operation.num(5)
//3
let exp3 = Operation.num(3)
//9
let exp9 = Operation.num(9)
//3+9
let exp3JoinExp9 = Operation.additive(left: exp3, right: exp9)
//集成
let finalExp = Operation.multiplication(left: exp5, right: exp3JoinExp9)
________________________________over
swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念的更多相关文章
- 四、可空类型Nullable<T>到底是什么鬼
值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...
- 【转】四、可空类型Nullable<T>到底是什么鬼
[转]四.可空类型Nullable<T>到底是什么鬼 值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类 ...
- C# 字符串操作,可空类型,文档注释,嵌套类型
字符串 字符串是Unicode字符串数组,且是不可变的 这种操作不会影响到原来的字符串,它会新添加一个副本. 有关Split的操作 using System; using System.Collect ...
- [C#基础知识系列]专题十:全面解析可空类型[转]
原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...
- 细说可空类型 nullable PropertyType
可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...
- Unity使用可空类型(Nullable Types)
译林军 范春彦|2014-04-09 09:46|5407次浏览|Unity(375)0 你怎么确定一个Vector3,int,或float变量是否被分配了一个值?一个方便的方式就是使用可空类型! 有 ...
- Item 30 用enum代替int常量类型枚举,string常量类型枚举
1.用枚举类型替代int枚举类型和string枚举类型 public class Show { // Int枚举类型 // public static final int APPLE_FUJI ...
- C#中枚举类型和int类型的转化
先定义一个枚举类型 , 初中, 高中,大学 }; int ->enum int d=2; PropertyType a=(PropertyType)d; int <- enum Prop ...
- C#枚举类型和int类型相互转换
C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...
随机推荐
- selenium测试(Java)--多窗口切换(十三)
selenium测试(Java)--多窗口切换(十三) 如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过s ...
- 《编写可维护的JavaScript》——JavaScript编码规范(三)
啦啦啦啦啦,今天第二篇随笔\(^o^)/~ ////////////////////////////////正文分割线////////////////////////////////////// 直接 ...
- 关闭编辑easyui datagrid table
var rows = dg.datagrid('getRows'); for (var i = 0; i < rows.length; i++) { dg.datagrid( ...
- Java程序的编码规范
所有的程序开发手册都包含了各种规则.一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的.这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑. 一.命名 ...
- electron打包发布
1.全局安装electron npm install electron -g 在cmd 直接输入 electron 直接启electron 2.编写第一个Electron应用 在任何地方,建立一个ap ...
- Java SE 简介 & 环境变量的配置
Java SE 简介 & 环境变量的配置 一.Java 技术的三个方向 Java 技术分为三个方向 javaSE( Java Platform Standard Edition 标准版)用来开 ...
- VS配置路径和宏
http://blog.csdn.net/puttytree/article/details/7838419
- 创建XMLHttpRequest对象
创建XMLHttpRequest对象 XMLHttpRequest对象: 用于在后台与服务器交换数据,可以在不重新加载整个页面的情况下,对页面的部分内容进行更新. 创建XMLHttpRequest对象 ...
- getFragmentManager()和getSupportFragmentManager()
在Android开发中,少不了Fragment的运用.目前在实际运用中,有v-4包下支持的Fragment以及app包下的Fragment,这两个包下的FragmentManager获取方式有点区别, ...
- FPGA重要设计思想
FPGA重要设计思想 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一. ...