Swift-可选值(Optional)讲解

摘要:
前提:Swift中规定,对象中的任何属性在创建时都必须具有明确的初始化值。1.定义可选类型的方法:1.通用方法(不常用)varname:optional<String>=nil方法2:语法sugar(常用)varname:String//Countis100}else{“nil”}如果判断为真,则将解压缩上述代码。为了避免在条件判断语句之后进行一次或多次解包,Swift引入了OptionalBinding,因此我们可以执行varcount:Int?

前提:Swift中有规定:对象中的任何属性在创建时,都必须要有明确的初始化值

1.定义可选类型

方式一:常规方式(不常用)

var name : Optional<String> = nil

方式二:语法糖(常用)

var name:String? = nil

Optional理解:

  Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也和Objective-C有些不一样,在Objective-C中,只有对象才能为nil,而在Swift里,当基础类型(整形、浮点、布尔等)没有值时,也是nil,而不是一个初始值,没有初始值的值,是不能使用的,这就产生了Optional类型。定义一个Optional的值很容易,只需要在类型后面加上问号(?)就行了:

let nameStr: String?

  Optional值和非Optional值的区别就在于:Optional值未经初始化时也为nil,非Optional未初始化时什么都没有,如果直接使用会报错:

//未被初始化,但是是一个Optional类型,为nil

var nameStr: String?

str //输出nil

//未被初始化,也不是Optional类型

var nameStr2: String

str2    //使用时出错

Optional拆包:

  Optional类型的值不能被直接使用,当需要用时要显式拆包,以表明我知道这个Optional是一定有值的:拆包的方式是直接在变量后加!

var nameStr: String? = "Hello World!"

nameStr     //{Some "Hello World!"}

nameStr!    //Hello World!

  拆包的原因是因为Optional类型其实是一个枚举:

enum Optional<T> : Reflectable, NilLiteralConvertible {

    case None

    case Some(T)

    init()

    init(_ some: T)

    /// Haskell's fmap, which was mis-named

    func map<U>(f: (T) -> U) -> U?

    func getMirror() -> MirrorType

    static func convertFromNilLiteral() -> T?

}

拆包的作用就是将值取出来。

隐式拆包:

  除了显式拆包,Optional还提供了隐式拆包,通过在声明时的数据类型后面加一个感叹号(!)来实现:

var nameStr: String! = "Hello World!"

nameStr //Hello World!

  可以看到没有使用(?)进行显式的折包也得到了Some中的值,这个语法相当于告诉编译器:在我们使用Optional值前,这个Optional值就会被初始化,并且总是会有值,所以当我们使用时,编译器就帮我做了一次拆包。如果你确信你的变量能保证被正确初始化,那就可以这么做,否则还是不要尝试为好。

Optional Binding

var count: Int?

count = 100

if count != nil {

    "count is " + String(count!)    //count is 100

} else {

    "nil"

}

上面代码,如果判断为真,下面将进行拆包,为了避免在条件判断语句后执行一次或更多次的拆包,Swift引进了Optional Binding,我们就可以这样做

var count: Int?

count = 100

if let validCount = count {

    "count is " + String(validCount)    //count is 100

} else {

    "nil"

}

通过在条件判断语句中(如if、while等)把Optional值直接给一个临时常量,Swift会自动检测Optional是否包含值,如果包含值,会隐式的拆包并给那个临时常量,在接下来的上下文中就能直接使用这个临时常量了

注意:强制解包是危险操作,容易导致程序崩溃

建议在强制解包前,先对可选类型进行判断,判断是否为nil

可选绑定

写法一:(不常用)因为每次解包要创建一个新的变量

if let tempName = name{

print(tempName)

}

解释:1.判断name是否有值,如果没有不执行{}内容,如果有值,系统会自动将name解包,并且直接复制给tempName

写法二:(常用),就近原则

if let name = name{

print(name)

}

免责声明:文章转载自《Swift-可选值(Optional)讲解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Maven构建java项目为可执行的jar包(包含依赖jar包)图像识别模型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[大数据技术]datax的安装以及使用

1、datax简述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。  datax的开源地址:https://g...

FilterLog代码分析

1、Filter:Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。Servlet API中提供了一个Filter接口,开发web...

SHA256加密(登陆注册的-密码加盐)

主要代码: 1 // 盐值 2 String salt = null; 3 String password = user.getPassword(); 4 //加密密码 5 String encryptPassword = null; 6 7 salt...

常用后端json处理方法

一、什么是json? json本来是javascript里的内容,有时后端要传各种各样的数据格式来适应前端,所以需要用到json来转换,用它来表示各种各样复杂的数据,如对象,数组,集合,以及集合的集合等数据。 json是一种轻量级的前端后端以及网络传输的数据交换格式,就是一串字符串,只不过元素会使用特定的符号标注。 {} 双括号表示对象,[] 中括号表示数...

httpclient个人理解

httpclient:模拟浏览器发送请求,服务器会响应数据,用心区域网内 不同系统间的请求调用 依赖  httpclient.jar和httpcore.jar需要同时纯在 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifac...

Java 后端微信支付demo

Java 后端微信支付demo 一、导入微信SDK 二、在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建) 三、实现微信的WXPayConfig接口 1 packagecom.ieou.demo.common; 2 3 4 importcom.github.wxpay.sdk.WXPayCo...