可选类型,swift可选类型

[iOS笔记]斯威夫特中的Optional类型 (可选类型)

[iOS笔记]斯威夫特中的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

       
在Swift中,可选类型其来自是3个枚举型,里面有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 来推断1个Optional类型是还是不是有值

var convertedNumber: Int? 

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

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

在if语法中的用法

运用 if 语句和 nil 来判断2个Optional类型是或不是有值

var convertedNumber: Int? 

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

在if语法中的用法

可选类型,swift可选类型。应用 if 语句和 nil 来推断三个Optional类型是还是不是有值

var convertedNumber: Int? 

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

可选绑定( optional binding )

动用optional
binding来推断optional类型是或不是有值,并且只要有值就把值赋给3个常量大概一时变量。
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类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。

可选绑定( 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的.

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

澳门葡京备用网址,强制解析/解包 ( forced unwrapping )

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

当Option == nil时,使用 ! 来获得会招致运营时不当。所以选用 !
来强制解析值以前,一定要规定Option类型不是nil的

强制解析/解包 ( forced unwrapping )

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

当Option == nil时,使用 ! 来获取会促成运营时不当。所以采用 !
来强制解析值从前,一定要规定Option类型不是nil的

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

突发性在编写程序中,2个optional类型第二次被赋值后,能够规定它以往总会有值,
在这种场地下,使用它时老是都还亟需看清和解包optional类型是老大低效的,因为能够明确它总会有值,

故此斯威夫特中定义了八个隐式解析可选类型,它在选拔时方可自动分析,
把( String? )改成惊叹号( String! )就能够声Bellamy(Bellamy)个隐式解析可选类型。

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


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

而是需求留意:

  • 假使您在隐式解析可选类型未有值的时候取值,会触发运营时不当,
    那和您在无值的平日Optional类型后边加二个惊讶号的现象同样;

  • 只要2个变量以后还可能变为 nil 的话,不要选择隐式解析可选类型;

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

           
二.假诺代码中的常量变量须求适配不存在的情况,务必将它表明为方便的可选类型;

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

偶然在编写程序中,三个optional类型第一回被赋值后,能够规定它之后总会有值,

在那种气象下,使用它时每一回都还索要看清和平消除包optional类型是丰盛低效的,因为可以规定它总会有值,

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

把( 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类型前面加3个感叹号的光景同样;

  • 一经3个变量未来还或然成为 nil 的话,不要使用隐式解析可选类型;

  • 与此同时只要急需在变量的生命周期中判定是或不是 是 nil
    的话,请使用普通可选类型;

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

有时在编写程序中,多个optional类型第2回被赋值后,能够鲜明它未来总会有值,

在这种情况下,使用它时老是都还索要看清和解包optional类型是不行低效的,因为能够规定它总会有值,

于是Swift中定义了二个隐式解析可选类型,它在选拔时得以活动分析;

把( 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类型前边加2个惊讶号的景色同样;

  • 假使三个变量现在还恐怕形成 nil 的话,不要选拔隐式解析可选类型;

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

可以了然为隐式解析可选类型用于表明初步化时只怕为nil,但自此会立即被赋值,并且不会再造成nil的Optional类型对象

         
3.一旦定义的可选类型的靶子不提供暗中同意值,则该目的私下认可将自动为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);

那边1二分首要说一下可选绑定:

直白上例子

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

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

可选类型取值格局一:

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

//注意:假如可选类型中绝非值,那么强制解包程序会崩溃

//强制解包是3个非常危急的操作,建议在解包前先推断可选类型中是还是不是有值

可选类型取值格局2:

       if name! =nil{

          print(name!)

        }

可选类型取值格局三:

可选绑定

壹.论断name是还是不是有值,如若未有值,则不进行{}

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

   if let tempName = name{

       print(tempName)

     }

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

 if let name = name {

          print(name)

   }

相关文章

发表评论

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

*
*
Website