///'!','?','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. egret升级经验记录

    1.StageDelegate.setDesignSize ; 直接去掉,在3.x里是直接在index.html里设置如: data-content-width="960" dat ...

  2. 【C#/WPF】TextBlock/TextBox/Label编辑文字的问题

    标题有点描述不清,就当是为了方便自己用时易于搜索到. 总之需求是:显示用户信息(文字)时,允许用户编辑自己的信息. 效果图如下: 点击[编辑]按钮前: 点击[编辑]按钮后,允许编辑: 别吐槽为甚性别还 ...

  3. HashMap与ConcurrentHashMap的区别<转>

    从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...

  4. 添加信任站点和允许ActiveX批处理

    有两种写法 1.如果是用IP reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMa ...

  5. Ajax轮询——“定时的通过Ajax查询服务端”

    Ajax轮询——"定时的通过Ajax查询服务端". 概念: 轮询(polling):客户端按规定时间定时像服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 百闻 ...

  6. 周末大礼:jQuery技巧总结

    一.简介 1.1.概述 随着WEB2.0及ajax思想在互联网上的快速发展传播,陆续出现了一些优秀的Js框架,其中比较著名的有Prototype.YUI.jQuery.mootools.Bindows ...

  7. android listview 总结

    ScrollView与ListView冲突: public class MyExpandableListView extends ExpandableListView { public MyExpan ...

  8. Intellij IDEA:maven的本地仓库问题

    不知是否我个人的问题,Intellij IDEA中设置的 maven本地仓库的位置 经常失效,动辄变回默认的路径(~/.m2/repository),然后疯狂下载内容. 很抓狂! 今天认真思考了一番, ...

  9. e683. 设置打印的方向

    PrinterJob pjob = PrinterJob.getPrinterJob(); PageFormat pf = pjob.defaultPage(); if (portrait) { pf ...

  10. CentOS 7在桌面添加快捷方式

    直接把 /usr/share/applications 对应的 xxx.desktop 文件复制到桌面就OK!比如要在桌面创建Google Chrome Browser的快捷方式,直接在找到 /usr ...