///'!','?','as'的用法

///'!'与'?'用法与可选类型(Optional)

///首先要了解Optional类型包括什么,

///Optional类型的值包括: 1.nil 2.值

///声明Optional类型变量如: var arr : NSMutableArray?(整个NSMutableArray?是一个类型叫可选类型),与之对应的是:

///var arr : NSMutableArray(非可选类型)

///区别在于1.非可选类型,声明后想使用必须赋值,否则变量无值,使用系统报错2.可选类型,声明后默认当没有值的时候就会给一个nil值,使用系统不会报错.

///Optional类型和非Optional类型

/*可选型数组,声明就有nil值*/

/*可选类型其实 是一个枚举类型*/

enum Optional : NilLiteralConvertible {

         case None

         case Some(T)

 }

/*全写Optional类型变量*/

 var arr: Optional<NSMutableArray> = nil

 var arr: NSMutableArray?

 

/*不可选数组,声明必须赋值不赋值,否则无法使用*/ vararr1 :NSMutableArray //打印在不赋值的情况下为nil DEBUGLOG("可选数组Arr:\(arr)") //打印在不赋值的情况下系统报错 //DEBUGLOG("不可选数组\(arr1)") ///'!','?'放在变量后 //打印的时候有两种一个是'!'一个是'?'分别代表着什么呢? //用'!'强制拆包把原来可选(Optional)数组的非nil值取出来,当可选数组arr通过强制拆包没有非nil值的时候,运行时系统就会抛出错误. //用'?'来取arr里面的可选类型值,当arr没有值的时候,可选类型会返回一个nil值来供我们使用 /*编译器抛出错误unexpectedly found nil while unwrapping an Optional value*/ //DEBUGLOG(arr![0]) /*正常运行*/ DEBUGLOG(arr?[]) ///中间有个小插曲演示一下,这个时候我给可选数组(Optional)赋值了一个空数组,再次打印arr?[0] /*因为可选数组已经有有值了是一个空数组[],我们arr?并不是像上面那样判断了arr初始是否为空,为空赋值nil,不为空取值.而是因为arr?判断数组确实有值,值为[](空数组),取出空数组,所以提示数组越界*/ arr = [] /*这个时候系统抛出一个错误: -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array*/ //DEBUGLOG(arr?[0]) ///可选变量的值可以当作if的条件语句,有值为真,否则为假 ifletvalue = arr { DEBUGLOG("有值\(value)") }else{ DEBUGLOG("无值") } ///总结:在使用Optional变量的时候,我们一般如下操作: ///1.当需要使用Optional变量的值的时候,我们对Optional变量'.!'来强制拆包取非nil值,当然,如果Optional没有非nil值,会crash. ///2.当需要使用Optional变量的方法的时候,我们对Optional变量'.?'来进行取值,如果有值返回值,无值返回nil. ///3.可选变量的值可以当作if的条件语句,有值为真,否则为假

Swift-'!','?'用法的更多相关文章

  1. Swift基础之自定义PUSH和POP跳转动画

    之前用OC代码写过PUSH和POP的转场动画,闲来无事,将其转换成Swift语言,希望对大家有帮助,转载请注明.... 如何实现PUSH和POP的转场动画? 首先,创建一个NSObject的类,分别用 ...

  2. iOS -Swift 3.0 -for(循环语句用法)

    // // ViewController.swift // Swift-循环语句 // // Created by luorende on 16/12/08. // Copyright © 2016年 ...

  3. swift基本用法-数组array

    数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...

  4. Swift - 带结果列表的搜索条(UISearchDisplayController)的用法

    (注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能,可参考我的另一篇文章“Swift - 使用UISea ...

  5. Swift枚举的全用法

    鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法. 基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举: enum Mo ...

  6. Swift泛型协议的N种用法

    They said "you should learn a new language every year," so I  learned Swift. Now  I  learn ...

  7. Swift - enumerateObjectsUsingBlock的用法

    enumerateobjectsusingblock:不是Array的方法在NSArray使用.如果你想使用它,你需要一个实例NSArray而不是Array. import Foundation va ...

  8. swift函数的用法,及其嵌套实例

    import Foundation //swift函数的使用 func sayHello(name userName:String ,age:Int)->String{ return " ...

  9. SWIFT UITableView的基本用法

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  10. iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)

    // // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...

随机推荐

  1. Android ListView 长按列表弹出菜单

    Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMen ...

  2. uboot在nandflash存储时内存和NandFlash存储空间

    硬件采用nandflash,nandflash为8位数据宽度,没有dataflash和norflash. Nandflash空间分配为 bootstrap + u-boot + env + linux ...

  3. QML vs WEB

    UI领域, 如果是桌面应用,QML可以更快速.如果是手机UI,H5绝对占优. 移动设备已经为各行业的HMI的响应性和用户友好性设定了标准.汽车,医疗设备,工业自动化系统和消费电子产品制造商现在希望为其 ...

  4. C++中声明与定义的区别

    如果是指变量的声明和定义: 从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存.而 定义就是分配了内存.对于下面的两句代码:void Func(){in ...

  5. shell脚本----for循环

      1.方法1 #!/bin/bash for((i=1;i<10;i++)) do echo $i done 保存为for1.sh 直接sh for1.sh 会报错: Syntax error ...

  6. 专题实验 EXP & IMP

    导入导出时 oracle 提供的实用工具, 如果这些被导出的对象还存在其他的相关对象, 比如要被导出的表上还存在索引, 注释等, 则导出工具会自动将这些相关的对象也提取出来, 并放入到导出的文件中去. ...

  7. laravel bald视图控制流与子视图

    1:laravel 视图控制流的写法 假设控制器代码如下 $data = [ 0 => '张三', 1 => '李四', 2 => '王五' ]; return view('test ...

  8. TCP协议的问题

    Server端接收到Client端信息后不会返回给Client端 // TCPEchoServer.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h&quo ...

  9. android tab之间滑动切换界面功能

    1. onTouchListener();                       //捕捉touch事件,比如说onDown 需要将可滑动的控件加上两个方法:(1)view.setOnTouch ...

  10. udhcpc

    /********************************************* * dhcpc * dhcpc是dhcp的客户端,在busybox中实现.今天正好了解一下. * Tony ...