Swift-'!','?'用法
///'!','?','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-'!','?'用法的更多相关文章
- Swift基础之自定义PUSH和POP跳转动画
之前用OC代码写过PUSH和POP的转场动画,闲来无事,将其转换成Swift语言,希望对大家有帮助,转载请注明.... 如何实现PUSH和POP的转场动画? 首先,创建一个NSObject的类,分别用 ...
- iOS -Swift 3.0 -for(循环语句用法)
// // ViewController.swift // Swift-循环语句 // // Created by luorende on 16/12/08. // Copyright © 2016年 ...
- swift基本用法-数组array
数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...
- Swift - 带结果列表的搜索条(UISearchDisplayController)的用法
(注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能,可参考我的另一篇文章“Swift - 使用UISea ...
- Swift枚举的全用法
鉴于昨天开会部门会议讨论的时候,发现有些朋友对枚举的用法还是存在一些疑问,所以就写下这个文章,介绍下Swift下的枚举的用法. 基本的枚举类型 来,二话不说,我们先贴一个最基本的枚举: enum Mo ...
- Swift泛型协议的N种用法
They said "you should learn a new language every year," so I learned Swift. Now I learn ...
- Swift - enumerateObjectsUsingBlock的用法
enumerateobjectsusingblock:不是Array的方法在NSArray使用.如果你想使用它,你需要一个实例NSArray而不是Array. import Foundation va ...
- swift函数的用法,及其嵌套实例
import Foundation //swift函数的使用 func sayHello(name userName:String ,age:Int)->String{ return " ...
- SWIFT UITableView的基本用法
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
// // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...
随机推荐
- ggplot2作图详解:入门函数qplot
ggplot2作图详解:入门函数qplot ggplot2的功能不用我们做广告,因为它的作者Hadley Wickham就说ggplot2是一个强大的作图工具,它可以让你不受现有图形类型的限制,创 ...
- java-基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet3.0中使用request.getParts()获取上传文件
- 【转】7Z命令行解压缩
7z.exe在CMD窗口的使用说明如下: 7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <co ...
- 【转】【OPenGL】opengl 64位 配置 freeglutx64下载
1.GLEW The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension ...
- [转载]php设计模式之单例、多例设计模式
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...
- bootstrap -- css -- 表单控件
若干css样式 .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14p ...
- Spring部署报错:Could not open ServletContext resource [/db.properties]
在使用Spring MVC过程中,部署项目报错,报错信息如下: 八月 15, 2016 5:02:04 下午 org.apache.catalina.core.StandardContext list ...
- Configurations of Vim/GVim of dsp
Linux环境写到用户主目录下的.vimrc文件(没有则新建),Windows环境则为GVim安装目录下的_vimrc(没有则新建),内容如下: "分上下两屏 "sp " ...
- par函数cex参数-控制文字和点的大小
cex参数用来控制图片中点和文字的大小,对于一副图片来说,有很多的文字部分,包括x轴标签(xlab), y轴标签(ylab), x轴刻度上的文字, y轴刻度上的文字,主标题(main), 副标题(su ...
- Oracle查询优化--单表查询
--查询所有 select * from emp; select * from emp where comm is null; --错误表达 --select * from emp where com ...