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

我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的;

目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是不会给变量赋值初始值的,所以当你声明一个字符串变量的时候,var string:String   就会被系统报错,但是目前的swift版本却不报错了。

但是你要给一个字符串赋值未nil的时候,var string:String = nil 就一定是错误的   因为nil并不是一个字符串类型,而实际上他是 optional.none ,正确的写法就应该是 var string:String? = nil;

?在swift中表示可选类型,用于处理值缺失的情况,可选表示那儿有值,并且这个值可以是X或者是空;

!表示强制拆包,他是一种隐式的强制可选类型,表示当前标记的变量一定不为空,当然如果为空的话必崩溃。或者当前标记的变量类型和赋值的类型是一致的。



可选绑定( optional binding )

使用optional binding来判断optional类型是否有值,并且如果有值就把值赋给一个常量或者临时变量。

optional binding可以用在 if 和 while 语句中:

var string:String? = "e"
if let test = string {
    print("当前的可选类型的变量有值")
}


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

有时候在编写程序中,一个optional类型第一次被赋值后,可以确定它以后总会有值,

在这种情况下,使用它时每次都还需要判断和解包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 // 不需要感叹号


swift 3.0变化

swift3.0对于可选类型控制更加严谨,隐式可选类型和其他类型的运算之后获得的是可选类型而不是隐式可选类型

let a:Int! = 1
let b = a + 1 // 此时强制解包,b是Int型
let c = a // 注意此时c是Int? 在之前的Swift版本中c是Int!
 
时间: 2024-10-12 19:57:48

Swift中的Optional类型 (可选类型)与强制解包 ? !的相关文章

Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么? 首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量. var stringValue = "5" var intValue = stringValue.toInt(); println("intvalue = \(intValue)") 执行以上方法后得到了奇怪的结果: intvalue = Optional(5) 其实,可以发现,toInt方法的返回值并不是Int,而是In

swift学习第九天:可选类型以及应用场景

可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) 在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言) 但是开发中赋值nil,在所难免.因此推出了可选类型 可选类型的取值: 空值 有值 定义可选类型 定义一个可选类型有两种写法 最基本的写法 语法

0000_0000_0000_0100.Optional<T> 可选类型闲谈

0000 0000 0000 0100 写于2015.04.07 10:13 清明已过,是时候收收心,继续码代码了. Optional 可选类型闲谈 在我印象中,可选类型应该分为显示可选类型和隐式可选类型.分别是这样的: var explicitPara:Type? //显示 初始化时假如不给赋值 默认都是nil var implicitPara:Type! //隐式 不知道自己记得对不对.两者都是可选类型,自然就有共性,可选类型定义为一个变量(不仅仅是class)要么有值,且值等于x,要么就不

swift中的optional

optional一些理解和总结: Optional作为一种类型,既可以存储一个值,也可以为空(也就是swift里的nil): 其实为一个枚举类型,包含nil或者一个值,如下: enum Optional<T>: _Reflectable, NilLiteralConvertible { case None case Some(T) //... } 它只有两种状态,包含一个值或者为空:optional有效解决了值为空的清空:我们可以通过判断一个对象是否为空了做出相应解决,通过if let a =

[翻译]理解Swift中的Optional

原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你第一次使用时可能会感到困惑.Optionals将会在编译阶段检查哪些值为nil.通过这种方式,你可以更好的保证应用程序交付在用户手里是可运行的.在Swift中,Optionals也提供了一些接口用来和遗留的Objective-C代码之间交互. 初试Optional 让我们在XCode中新建一个叫做s

swift中,Optional、?与!之间的关系

Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时候,取值就会崩溃) imageView!.image 是对 imageView 强制解包, imageView.image! 则是对 image 的强制解包, 如果解包后发现为nil, 则崩溃 除了 ! 与 ? , 还存在一种叫 NilLiteralConvertible 的东东 '?' must be followed by a call, member

初步swift语言学习笔记2(可选类型?和隐式可选类型!)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 假设认为文章对你有所帮助.请通过留言或关注微信公众帐号fengsh998来支持我,谢谢. 可选类型.隐式可选类型 在swift中.可选类型其根源是一个枚举型.里面有None和Some两种类型.事实上所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这

swift中变量的几种类型

swift中变量分为 optional,non-optional 以及 implicitly unwrapped optional 这几种类型 var nullableProperty : AnyObject? // optional var nonNullProperty : AnyObject // non-optional var unannotatedProperty : AnyObject! // implicitly unwrapped optional 其中,optional (如

java基础类型包装类与自动打包解包

一基础类型包装类 基础数据类型存放在内存的栈区域,可以通过包装类将基础数据类型转换为引用数据类型,即存储在堆与栈中. 基础数据类型一共有8种,相对应的包装类也有8种.分别是Byte,Short,Integer,Long,Float,Double,Character,Boolean.类 包装类位于java.Lang包中. 1 public class Test1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-genera