***************可为空的类型

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_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念的更多相关文章

  1. 四、可空类型Nullable<T>到底是什么鬼

    值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...

  2. 【转】四、可空类型Nullable<T>到底是什么鬼

    [转]四.可空类型Nullable<T>到底是什么鬼 值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类 ...

  3. C# 字符串操作,可空类型,文档注释,嵌套类型

    字符串 字符串是Unicode字符串数组,且是不可变的 这种操作不会影响到原来的字符串,它会新添加一个副本. 有关Split的操作 using System; using System.Collect ...

  4. [C#基础知识系列]专题十:全面解析可空类型[转]

    原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...

  5. 细说可空类型 nullable PropertyType

    可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...

  6. Unity使用可空类型(Nullable Types)

    译林军 范春彦|2014-04-09 09:46|5407次浏览|Unity(375)0 你怎么确定一个Vector3,int,或float变量是否被分配了一个值?一个方便的方式就是使用可空类型! 有 ...

  7. Item 30 用enum代替int常量类型枚举,string常量类型枚举

    1.用枚举类型替代int枚举类型和string枚举类型 public class Show {   // Int枚举类型   // public static final int APPLE_FUJI ...

  8. C#中枚举类型和int类型的转化

    先定义一个枚举类型 , 初中, 高中,大学 }; int ->enum int d=2; PropertyType  a=(PropertyType)d; int <- enum Prop ...

  9. C#枚举类型和int类型相互转换

    C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...

随机推荐

  1. 自定义指令-directive (转)

    1.指令作用域中的@ 作用是把当前属性作为字符串传递. 前台代码: <div ng-controller="MyCtrl">       <drink water ...

  2. css浮动与绝对定位小记

    浮动 float属性可以设置的值为none,left,right.对于设置了浮动的元素,会向其父元素的左侧或右侧紧靠,默认情况下,盒子的宽度不再伸展,而是根据盒子里面的内容来确定.浮动可以让一个元素移 ...

  3. C语言的内存分配

    内存分为五大区: 1.栈区:在函数内部声明的变量都存在栈区,只管申请,系统会帮我们自动释放,释放的时间是作用域结束,遵循先进后出(first in last off(FILO)),栈的开辟是连续的,不 ...

  4. python代码中碰到的问题及解决

    一.针对raw_input输入的字符进行类型判断及转换: raw_input输入默认为字符,如果输入的是数字字符,想自动转换,即:输入为a,不做操作,如果输入为3,即转化为整数. 可利用try..ex ...

  5. Excel取消超级链接

    背景 本人使用Excel作笔记,偶尔会将一些url存到文档中.Excel会自动给这些url加上超链接,下次使用的时候,因为会单机跳转,导致选中复制很不方便. 解决方式 修改配置,避免给自动url加上超 ...

  6. Material Design学习

    前言: 最为一个用习惯了bootstrap的前端小菜,今天偶然听闻material design 这个从未听闻的前端框架,带着好奇开始了新的尝试,并将bootstrap跟material design ...

  7. iis发布后,未能找到编译器可执行文件 csc.exe

    iis 未能找到编译器可执行文件 csc.exe在一台新安装完的Windows Server 2003上,打上Framework 3.5,配置好WebService的IIS,结果浏览时出现:未找到编译 ...

  8. Mac > MacBook Pro的移动硬盘方案

    灵感来自:http://cone.cc/2012/12/30/Macbook-Air-HD/ 主要为了解决:如果让移动硬盘,无缝地,安全地,同时应用在苹果电脑系统和微软的系统. 除了储存文件,我还想用 ...

  9. JAVA可阻塞队列-ArrayBlockingQueue子类BlockingQueue的应用,使用它来实现子线程打印10次,主线程打印100次,如此反复

    /** * 使用BlockingQueue实现主子线程互相打印 * @author duwenlei * */ public class BlockingQueueTest { public stat ...

  10. highcharts php请求mysql返回json数据作为数据源进行制图

    直接上代码 [官方文档请参见http://www.highcharts.com/docs/working-with-data/getting-data-across-domains-jsonp] [实 ...