初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
来源:互联网 发布:天刀捏脸数据冷艳太白 编辑:程序博客网 时间:2024/05/17 03:26
可选类型、隐式可选类型
在Swift中,可选类型其根源是一个枚举型,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因, 也是PlayGround会把Optional值显示为类似{Some "hello world"}的原因,这里是enum Optional的定义:
语法使用“?”操作符及"!"号操作符
如:“var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}”
大家把optionalName改为nil时看一下会有什么结果?按照理解,应该是? = 后的为可选值,即当我们的的变量为nil时,这里如果有?=操作,则会使用?=后的值作为默认值,而不会为nil. 这个等有环境时,验证一下。
经验证:
分别执行:
输出为:
ok good
与输出为:
nil
来看下!号,官方释为隐式解包:主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况。这主要用在类的初始化过程中。
官风例子:
实说话,你照这个例子运行,还真看不出什么,得不出什么结论。因此我自己Z磨着,试着理解一个英文翻译。再自己操刀练习。得出下面的一些结论。
凡在变量或常量后加上?的都是一个可选变量/可选常量
凡在变量或常量后加上!的都是隐式可选变量/常量,有点难理解,首先该变量或常量满足可选类型,其主要是可被当生一般的变量/常量来使用,而不需要每次都验证是否有值。
注:如果一个隐式解包的可选类型不包含一个实际值,那么对它的访问会抛出一个运行时错误。在变量/常量名后面加!的情况也是一样的。
好,现在重点来了,这是很关键的一个测试。把possibleString = nil 这句注释放开让其动行,再分别来看一下println带!和不带!的情况:
情况一:不带!号时,输出为nil .
情况二:再来看一下带!号这时运行到这句println就会crash了。会报fatal error: Can't unwrap Optional.None
错误。在情况一时,为什么不会报错,是因为这是一个可选变量当变量为nil时,自动验证是否有可选的值,有则使用可选值,在情况二,加上!访问符来访问possibleString 变量,但由于possibleString设为了nil (等价于var possibleString: String?) 其并没有包含一个实际值,所以抛异常.同样对于下面使用!号来声明的也一样道:
同样会报:fatal error: Can't unwrap Optional.None
如果你定义了一个可选类型并且没有给予初始值的时候,会默认设置为nil
var surveyAnswer: String? // 初自动设置为nil
注: Swift 的nil不同于Object-C中的nil. Object-C中,nil是一个指针指向不存在的对象。Swift中,nil不是指针而是一个特定类型的空值。任何类型的可选变量都可以被设为nil,不光是指针。
在swift中作何变量/常量的声明都必须带有初始值,否则就要声明为可选型。
即var btn:UIButton 这样是编译报错的。因些必须改为带初始化的如:
var btn2 :UIButton = UIButton()
或者使用? 和! 来约束。因此常常声明可选或隐式可选变量如:
var btn :UIButton? // 默认btn = nil
var edt :UITextField! // 默认edt = nil
至于什么时候使用?什么情况下使用!号来约束变量,我还没有悟出真真原理。
因此借助于自己的几次验证来帮助大家理解。
因此为了运行期不crash可以改为如下:
或者
注:如果一个可选类型存在没有值的可能的话,不应该使用解包(隐式)可选类型。这种情况下,一定要使用正常的可选类型。
这句话我个人是这样理解的,如var view:UIView。当我的整个应用中或整个类中不可能存在view = nil的情况时可以设置为var view:UIView! 否则就可声明为var view:UIView?
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
- swift语言的学习笔记二(可选类型?和隐式可选类型!)
- swift语言的学习笔记二(可选类型?和隐式可选类型!)
- swift语言-可选类型
- Swift笔记:可选类型
- Swift的基本知识(三)<可选类型?和隐式可选类型!>
- swift学习可选类型
- Swift 可选类型 ?和!
- Swift-可选类型和可选链
- Swift学习 隐式解包的可选类型
- Swift学习:4.可选类型
- Swift可选类型的使用
- Swift:可选类型的含义
- Swift:可选类型(Optional)
- Swift-Optional(可选类型?!)
- swift 之可选类型
- 不能相邻的字符对
- 64. Minimum Path Sum
- 39. Combination Sum
- 216. Combination Sum III
- Linux下的一些问题收集及解决方法(一)
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
- C# Regex类详解
- Spark安装
- Python语言学习讲解五:列表(List)操作方法详解
- Android开发视频源码
- kernel version 367.48. does not match DSO version 367.57
- 安卓实现沉浸式状态栏
- (一)QT实现中国象棋(棋盘实现)
- AVR的GCC中断向量说明