swift可选类型,可选类型

By admin in 4858.com on 2019年4月28日

[iOS笔记]4858.com ,Swift中的Optional类型 (可选类型)

[iOS笔记]Swift中的Optional类型 (可选类型)

Optional类型表示: 有值 / 未有值

在Objective-C中并不曾Optional类型,
只有nil,并且nil只好用于表示对象类型无值,
并不能够用于基础项目(int,
float),枚举和结构体,基础项目要求回到类似NSNotFound的奇异值来代表无值,
之所以在斯威夫特中定义了Optinal类型来代表各体系型的无值状态,并显著了nil不可能用于非可选的常量和变量,只好用来Optinal类型

可选类型

Optional类型表示: 有值 / 未有值

在Objective-C中并未Optional类型,
唯有nil,并且nil只可以用于表示对象类型无值,

并不能够用来基础项目(int,
float),枚举和结构体,基础项目供给回到类似NSNotFound的特有值来表示无值,

就此在Swift中定义了Optinal类型来代表各种类型的无值状态,并显明了nil无法用于非可选的常量和变量,只好用来Optinal类型

Optional类型表示: 有值 / 未有值

在Objective-C中并从未Optional类型,
唯有nil,并且nil只可以用来表示对象类型无值,

并不可能用来基础项目(int,
float),枚举和结构体,基础项目供给回到类似NSNotFound的尤其值来表示无值,

之所以在Swift中定义了Optinal类型来表示各体系型的无值状态,并鲜明了nil无法用来非可选的常量和变量,只好用于Optinal类型

先看一下大旨的用法:

var serverResponseCode: Int? = nil
// serverResponseCode 现在不包含值

serverResponseCode = 404
// serverResponseCode 包含一个可选的 Int 值 404 

Int? 表示serverResponseCode可以是有值的也可以是无值的


var surveyAnswer: String?
//surveyAnswer 被自动设置为 nil

       
在斯威夫特中,可选类型其根源是2个枚举型,里面有None和Some三种类型.其实所谓的nil正是Optional.None,非nil便是Optional.Some,然后会因而Some(T)包装(wrap)原始值,那相当于行使Optional时怎么要拆包(从enum里抽取原始值)的缘由,也正是PlayGround会把Optional值显示为接近{Some
“hello word”}的因由

先看一下焦点的用法:

var serverResponseCode: Int? = nil
// serverResponseCode 现在不包含值

serverResponseCode = 404
// serverResponseCode 包含一个可选的 Int 值 404 

Int? 表示serverResponseCode可以是有值的也可以是无值的


var surveyAnswer: String?
//surveyAnswer 被自动设置为 nil

先看一下基本的用法:

var serverResponseCode: Int? = nil
// serverResponseCode 现在不包含值

serverResponseCode = 404
// serverResponseCode 包含一个可选的 Int 值 404 

Int? 表示serverResponseCode可以是有值的也可以是无值的


var surveyAnswer: String?
//surveyAnswer 被自动设置为 nil

在if语法中的用法

运用 if 语句和 nil 来剖断二个Optional类型是不是有值

var convertedNumber: Int? 

if convertedNumber != nil {
     print("convertedNumber contains some integer value.")
}

       
///可选类型类似于oc指针中指针的nil值,但是oc中nil只对类(class)有用,指针对象不设有,而斯威夫特中的nil不是指针,他意味着一定项目标值不存在.任何项目标可选类型都能赋值为nil,而不仅局限于对象类型,而且更安全

在if语法中的用法

选择 if 语句和 nil 来剖断一个Optional类型是不是有值

var convertedNumber: Int? 

if convertedNumber != nil {
     print("convertedNumber contains some integer value.")
}

在if语法中的用法

swift可选类型,可选类型。行使 if 语句和 nil 来判定2个Optional类型是不是有值

var convertedNumber: Int? 

if convertedNumber != nil {
     print("convertedNumber contains some integer value.")
}

可选绑定( optional binding )

运用optional
binding来剖断optional类型是不是有值,并且只要有值就把值赋给一个常量或许一时变量。
optional binding能够用在 if 和 while 语句中:

if let constantName = someOptional {
     print("get the value: \(constantName)")
}


//如果someOptional这个optional类型有值,创建一个叫做constantName的常量并将someOptional包含的值赋给它。
//并且因为constantName已经被optional类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。

/*

可选绑定( optional binding )

运用optional
binding来剖断optional类型是或不是有值,并且只要有值就把值赋给2个常量大概权且变量。

optional binding能够用在 if 和 while 语句中:

if let constantName = someOptional {
     print("get the value: \(constantName)")
}


//如果someOptional这个optional类型有值,创建一个叫做constantName的常量并将someOptional包含的值赋给它。
//并且因为constantName已经被optional类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。

可选绑定( optional binding )

选取optional
binding来剖断optional类型是还是不是有值,并且只要有值就把值赋给贰个常量大概权且变量。

optional binding能够用在 if 和 while 语句中:

if let constantName = someOptional {
     print("get the value: \(constantName)")
}


//如果someOptional这个optional类型有值,创建一个叫做constantName的常量并将someOptional包含的值赋给它。
//并且因为constantName已经被optional类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。

强制解析/解包 ( forced unwrapping )

当分明可选类型确实包涵值之后,能够在可选的名字背后加一个感慨号( !
)来获取值;
当Option == nil时,使用 ! 来获得会招致运维时不当。所以选取 !
来强制解析值从前,一定要鲜明Option类型不是nil的.

  注意: 壹.在swift中,非可选类型无法用nil,nil只可以用于可选类型中;

强制解析/解包 ( forced unwrapping )

当鲜明可选类型确实包罗值之后,能够在可选的名字背后加3个惊叹号( !
)来获取值;

当Option == nil时,使用 ! 来赢得会导致运行时不当。所以利用 !
来强制解析值之前,一定要分明Option类型不是nil的

强制解析/解包 ( forced unwrapping )

当分明可选类型确实包罗值之后,能够在可选的名字背后加1个感慨号( !
)来获取值;

当Option == nil时,使用 ! 来得到会变成运维时不当。所以使用 !
来强制解析值在此以前,一定要显明Option类型不是nil的

隐式解析可选类型 ( implicitly unwrapped optionals )

偶尔在编写程序中,多个optional类型第1次被赋值后,能够鲜明它今后总会有值,
在这种状态下,使用它时每一遍都还亟需判别和平化解包optional类型是十分低效的,因为能够规定它总会有值,

于是Swift中定义了2个隐式解析可选类型,它在采取时能够自动分析,
把( String? )改成惊讶号( String! )就足以声美赞臣个隐式解析可选类型。

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值


let assumedString: String! = "An implicitly unwrapped optional string." 
let implicitString: String = assumedString // 不需要感叹号

而是供给留意:

  • 举个例子你在隐式解析可选类型未有值的时候取值,会触发运营时不当,
    那和您在无值的一般性Optional类型前边加1个惊叹号的情景同样;

  • 设若2个变量以往还或然变为 nil 的话,不要使用隐式解析可选类型;

  • 再者只要须求在变量的生命周期中判别是或不是 是 nil
    的话,请使用普通可选类型;

           
2.只要代码中的常量变量要求适配不存在的情形,务必将它注脚为方便的可选类型;

隐式解析可选类型 ( implicitly unwrapped optionals )

有时在编写程序中,三个optional类型第2遍被赋值后,能够分明它之后总会有值,

在那种气象下,使用它时老是都还须求看清和平化解包optional类型是比异常的低效的,因为可以规定它总会有值,

由此Swift中定义了七个隐式解析可选类型,它在动用时得以活动分析;

把( String? )改成惊讶号( String! )就能够声喜宝(Hipp)(Nutrilon)个隐式解析可选类型。

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值


let assumedString: String! = "An implicitly unwrapped optional string." 
let implicitString: String = assumedString // 不需要感叹号

唯独急需留意:

  • 如果你在隐式解析可选类型未有值的时候取值,会触发运转时不当,

    那和您在无值的家常Optional类型前面加一个惊叹号的状况同样;

  • 比方二个变量今后还只怕变为 nil 的话,不要选择隐式解析可选类型;

  • 并且只要急需在变量的生命周期中推断是否 是 nil
    的话,请使用普通可选类型;

隐式解析可选类型 ( implicitly unwrapped optionals )

偶然在编写程序中,一个optional类型第壹遍被赋值后,能够鲜明它现在总会有值,

在那种意况下,使用它时每一遍都还索要看清和平消除包optional类型是非常的低效的,因为能够规定它总会有值,

为此斯威夫特中定义了3个隐式解析可选类型,它在应用时得以活动分析;

把( String? )改成咋舌号( String! )就能够声美素佳儿(Friso)个隐式解析可选类型。

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值


let assumedString: String! = "An implicitly unwrapped optional string." 
let implicitString: String = assumedString // 不需要感叹号

而是急需注意:

  • 倘诺您在隐式解析可选类型未有值的时候取值,会触发运转时不当,

这和您在无值的平凡Optional类型前面加三个感叹号的景色同样;

  • 借使一个变量今后还或许变成 nil 的话,不要选取隐式解析可选类型;

  • 再正是只要要求在变量的生命周期中决断是否 是 nil
    的话,请使用普通可选类型;

能够知道为隐式解析可选类型用于注明初步化时或者为nil,但将来会及时被赋值,并且不会再形成nil的Optional类型对象

         
三.借使定义的可选类型的目的不提供默许值,则该对象暗许将自动为nil,如:var
strValue: String?;  私下认可值则为nil

能够领略为隐式解析可选类型用于评释早先化时或者为nil,但事后会立刻被赋值,并且不会再形成nil的Optional类型对象

能够清楚为隐式解析可选类型用于注脚早先化时也许为nil,但此后会立刻被赋值,并且不会再产生nil的Optional类型对象

   计算?的应用景况

         1.声明Optional变量

        二.用Optional值操作中,用来剖断是或不是响应后边的操作

*/

//解包(!的用法)

/*

       
可选类型在历次访问的时候都会提前并检查测试它的值是还是不是留存,但有时候有依赖程序结构就能够测算出可选类型在第一遍赋值之后自然存在值,那个时候,就不需求每一回后检查评定值是或不是留存,借使鲜明一个可选类型的值一定期存款在,那么大家应用”!”举行解包获取它的值,也许选取Optional
Binding

*/

let possibleString: String? =”An Optional String”;

println(“possibleString = \(possibleString!)”);//明确该变量有值,则直接举办解包就可以(强制解包)

let stringValue = possibleString!.hashValue;

println(stringValue);

//Optional Binding//等价于上边(可选绑定)

if let sValue = possibleString {

let stringValue = sValue.hashValue;

}

//关于隐式解包

/*

       
把隐式解包可选类型当做自动解包的可选类型.即不是每一趟使用的时候在常量/变量后边加!,而是一直在概念的时候加!,这么些可选变量定义为隐式解包的可选量(implicitly
unwrapped optional).

     
 隐式解包的可选量的证明格式为:在希望标为可选的种类名称前边,用惊叹号(!)取代问号(?)

       
 隐式解包的可选类型主要用在1个变量/常量在概念刹那间落成之后值一定会存在的境况.首要用在类的开头化进程中.

*/

     let assumeString: String! =”Hello”;

      println(assumeString);

      println(assumeString.hashValue);

此处格外主要说一下可选绑定:

一直上例子

var name: String? //定义可选类型

name = “kris”  //给可选类型赋值

可选类型取值形式一:

print(name!)  //从可选类型中取值

//注意:假使可选类型中尚无值,那么强制解包程序会崩溃

//强制解包是一个那一个危急的操作,提出在解包前先判别可选类型中是不是有值

可选类型取值形式2:

       if name! =nil{

          print(name!)

        }

可选类型取值格局三:

可选绑定

1.料定name是还是不是有值,要是未有值,则不实行{}

2.假使有值,则对可选类型实行解包,并且将解包后的值赋值给前方的常量

   if let tempName = name{

       print(tempName)

     }

可选绑定精简版(用的最多)

 if let name = name {

          print(name)

   }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有