可空类型,对于熟悉C#的同学一定不会陌生。在C#里面值类型都是不能为空的,比如int类型默认为0,bool默认为false。但是我们给int加上?后,就是一个可空类型了。

那么Swift里面呢。Swift里面没有区分值类型,引用类型(或许有,可能我还没看到这方面的资料)。那这个可空是怎么回事呢。原来在Swift里变量默认是不为空的。看代码:

你给一个String类型的变量付空值nil是会报错的。

那怎么让一个变量能为空呢,做法跟C#一样,加一个?。看代码:

那怎么取可空变量的值呢。这里就得拆解(unwarp)的概念了。比如你直接使用上面的name赋值给另外一个name变量的话是会报错的。要使用!取出其中的值。

既然变量是可空,那么我们使用的时候就免不了判空。判空也跟C#一样。

这里有2个问题要提一下。就是当你用 !=去判断不为nil的时候,一定要注意了。一定要在!=两边加上空格。不然是会报错的。因为如果不加空格的话,编译器没法区分是对变量进行拆解还是取非运算。还有一个,对于非空类型的变量,是直接不能进行判空的。因为上面说了,变量默认是不能为空的,所以非空类型的变量去判空是没有意义的。这里对于习惯C#/JAVA的同学就会比较坑了。因为我们已经养成了有null风险的地方进行null检查。如下:

一点思考:

  这里还是跟C#进行一下比较。.NET C#里类型分值类型,引用类型。引用类型的变量全部可以为空。值类型不能为空。如果想要为空,那就是用可空类型。那我们开发的时候,可以发现其实使用引用类型的时候比使用值类型的时候多多了。因为除了FCL的Class,我们自定义的各种Class也都是引用类型。但是Swift却正好相反,Swift里变量默认是不能为空的。也就是跟C#里的值类型一样,都要给默认值。需要空的时候就使用可空来处理。这里也可以看出来2门语言的设计者不同的两种思路。C#觉得对象的属性/变量大部分时候是存在可空需求的。而Swift觉得对象的属性大部分时候是不存在可空需求的。C#里变量想空就空,比较灵活。但是这样也造成在使用的时候不得不小心翼翼,所以我们到处都是if(obj!=null)这种代码。Swift的话就不用到处Check null,但是不够灵活。比如当我发现某个属性有可能为空的时候,还要去修改声明,修改完声明,前面使用到这个变量的地方的代码全都要改,要判空,要拆解。这两种方案可以说各有利弊,不过个人比较偏向C#。

Swift可空(Optional)类型基础的更多相关文章

  1. Swift中的Optional类型 (可选类型)与强制解包 ? !

    我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...

  2. Swift的Optional类型

    我们使用Swift这个苹果新推出的编程语言已经有一段时间了.其中的一个极大的优点就是苹果称为“optional types”的东西.几乎所有的objective-c程序员都知道用nil来表示某个引用类 ...

  3. Swift中的Void类型与空元祖表达式

    可能有不少Swift开发者会忽略这么一个细节:在Swift中,Void类型其实是一个别名类型,而其真正的类型为(),即一个空元祖(empty tuple)! 这种语言特性给Swift带来了一些比较方便 ...

  4. Swift语言指南(七)--语言基础之布尔值和类型别名

    原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...

  5. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  6. Swift 可选值(Optional Values)介绍

    Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...

  7. Swift语言指南(一)--语言基础之常量和变量

    原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...

  8. Swift语法3.03(类型Types)

    类型 在Swift中,有两种类型:命名型类型和复合型类型.命名型类型是在定义时可以给定的特定名字的类型.命名型类型包括类,结构体,枚举和协议.例如,自定义的类MyClass的实例拥有类型MyClass ...

  9. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

随机推荐

  1. 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单

    1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...

  2. [数据库]SQL Server 用户NT AUTHORITY\IUSR 登录失败

    今天打开网站时,突然报这个错误,平时都好好的 Cannot open database "JMECC" requested by the login. The login fail ...

  3. Intellij IDEA 14的注册机

    将以下代码保存成keygen.java import java.math.BigInteger; import java.util.Date; import java.util.Random; imp ...

  4. android Animation 动画绘制逻辑

    参考:http://www.jianshu.com/p/3683a69c38ea 1.View.draw(Canvas) 其中步骤为:/* * Draw traversal performs seve ...

  5. Angular 使用

    tks: 使用: http://developer.51cto.com/art/201302/380661.htm http://www.infoq.com/cn/news/2013/02/angul ...

  6. 命令行 更新Android sdk

    使用如下代理服务器: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.b ...

  7. VS2010 发布web项目 问题

    载:http://www.cnblogs.com/shaocm/archive/2012/08/10/2632116.html

  8. memcpy 和直接赋值的性能差异

    不废话,看代码: #include <time.h> #include <stdint.h> #include <iostream> #define ARR_LEN ...

  9. messages.exe病毒的清理

    一.问题提出 20161021,10点05分,发现messages.exe突然出现在进程中,计算机突然重启,msconfig启动目录里多了一项c:\windows\system32\Drivers\m ...

  10. mmo设计

    基于多人格斗系统设计. 总体 1.放技能/使用道具,行走,公告,聊天 共性: A.服务端代理推送 B.管道内推送 2.玩家信息(统一玩家信息查看,去除每个模块自己实现) 3.怪物掉落(统一掉落控制.领 ...