Swift中?和!的区别

1.常量和变量

Swift语言中是用let来定义常量,并且要初始化。var来定义变量,在let或者var后面申明类型,冒号+空格,然后再加上类型名称。


2.optional(可选)变量

可选变量用于处理值缺失的情况,有点类似于OC中的nil,可以用于任何类型上,不仅仅是类,不过更加安全。Swift是类型安全的一门语言,可以很少申明类型。

附:Swift和Objective-C中nil的区别

1)OC中,nil是一个指向不存在对象的指针;

2)Swift中,nil不是指针,它是一个确定的值,用于表示值缺失。任何类型的可选状态都可以设置为nil,不只是对象类型;


3.深入了解Optional变量

Optional其实就是一个enum,里面有None和Some类型。nil就是Optional.None,非nil就是Optional.Some,通过Some(T)包装原始值,所以在是用Optional的时候要进行拆包。

声明一个可选类型的时候要在类型后面加上? 如:var str : String?

var strValue: String? 

意思不是“我声明了一个Optional的String值”,而是我声明了一个Optional类型值。


对一个可选类型的值,需要进行拆包才不会报错。

拆包有两种方式,如下:

1)Optional Binding

如:  if let str = strValue {

        let hashValue = str.hashValue

    }

2)通过! str!


对于会在viewDidLoad进行初始化的变量,可以直接定义为var str :String!叫做Implicitly Unwrapped Optionals,称为隐式拆包,在进行操作的时候也需要添加!进行拆包。


?的使用场景:

1)声明Optional值变量

2)在对Optional值操作中,用来判断是否能响应后面的操作


!的使用场景:

1)强制对Optional值进行拆包

2)声明隐式拆包变量,一般用于类中的属性


如果你在隐式解析可选类型没有值的时候进行取值,会crash。和在没有值的可选类型里面拆包是一样的。


4.总结

       可选类型在swift里面十分重要,在做项目的过程,要尤为重视可选变量,不然应用跑起来老是crash,并且debug也不方便找出错误来,不过Xcode提示功能也很不错,这里赞一个。总之,一定要谨慎。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hnuzengchao/article/details/50059887
个人分类: Objective-C&&Swift
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭