前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Swift-?-!

Swift-?-!

作者头像
用户3004328
发布于 2018-09-06 08:51:38
发布于 2018-09-06 08:51:38
92200
代码可运行
举报
文章被收录于专栏:增长技术增长技术
运行总次数:0
代码可运行

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值, 也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量 之前不进行初始化就会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var stringValue: String
// =>error: variable 'stringValue' used before being initialiezed
// =>let hashValue = stringValue.hashValue
// =>                            ^
let hashValue = stringValue.hashValue

上面了解到的是普通值,接下来Optional值要上场了。Optional其实是个enum,里面有None 和Some两种类型。其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会 通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值) 的原因,也是Playground会把Optional值显示为类似{Some”hello world”}的原因,这里是 enum Optional的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enum Optional<T>: LogicValue, Reflectable {
  case None
  case Some(T)
  init()
  init(_some: T)

  /// Allow use in a Boolean context.
  func getLogicValue() -> Bool

  /// Haskell's fmap, which was mis-named
  func map<U>(f: (T) -> U) -> U?
  func getMirror() -> Mirror
}

声明为Optional只需要在类型后面紧跟一个?即可。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var strValue: String?

一旦声明为Optional的,如果不显示的赋值就会有个默认值nil。判断一个Optional的值是否 有值,可以用if来判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if strValue {
  // do sth with strValue
}

然后怎么使用Optional值呢?文档中也有提到说,在使用Optional值的时候需要在具体的操作, 比如调用方法、属性、下标索引等前面需要加上一个?,“Optional Chaining的问号的意思是 询问是否响应后面的这个方法,和原来的isResponseToSelector有些类似”,如果是nil值,也 就是Optional.None,固然不能响应后面的方法,所以就会跳过,如果有值,就是Optional.Some, 可能就会拆包(unwrap),然后对拆包后的值进行后面的操作,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let hashValue = strValue?.hashValue

strValue是Optional的字符串,如果strValue是nil,则hashValue也为nil,如果strValue 不为nil,hashValue就是strValue字符串的哈希值

到这里我们看到了?的两种使用场景:

  1. 声明Optional值变量
  2. 用在对Optional值操作中,用来判断是否能响应后面的操作

另外,对于Optional值,不能直接进行操作,否则会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// =>error: 'String?' does not have a member named 'hashValue'
// =>let hashValue = strValue.hashValue
//                   ^        ~~~~~~~~~

let hashValue = strValue.hashValue

上面提到Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢? 拆包提到了几种方法,一种是Optional Binding,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if let str=strValue {
  let hashValue = str.hashValue
}

还有一种是在具体的操作前添加!符号,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let hashValue = strValue!.hashValue

这里的!表示“我确定这里的strValue一定是非nil的,尽情调用吧”,比如这种情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if strValue {
  let hashValue = strValue!.hashValue
}

{}里的strValue一定是非nil的,所以就能直接加上!,强制拆包(unwrap)并执行 后面的操作。当然如果不加判断,strValue不为nil的话,就会出错,crash掉。

考虑下这一种情况,我们有一个自定义的MyViewController类,类中有一个属性是myLabel, myLabel是在viewDidLoad中进行初始化。因为是在viewDidLoad中初始化,所以不能直接 声明为普通值:var myLabel: UILabel,因为非Optional的变量必须在声明时或者构造 器中进行初始化,但我们是想在viewDidLoad中初始化,所以就只能声明为Optional:var myLabel: UILabe?, 虽然我们确定在viewDidLoad中会初始化,并且在ViewController的生命周期内不会置为nil, 但是在对myLabel操作时,每次依然要加上!来强制拆包(?也OK),比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myLabel!.text = "text"
myLabel!.frame = CGRectMake(0, 0, 10, 10)
...

对于这种类型的值,我们可以直接这么声明:var myLabel: UILabel!, 这种是特殊的Optional, 称为Implicitly Unwrapped Optionals, 直译就是隐式拆包的Optional,就等于说你 每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作, 当然如果该值是nil,也一样会报错crash掉。

那么!大概也有两种使用场景

  1. 强制对Optional值进行拆包(unwrap)
  2. 声明Implicitly Unwrapped Optionals值,一般用于类中的属性
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
C++ 异常处理
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
C语言与CPP编程
2020/12/02
1.2K0
C++ 异常处理
【c++】异常
异常是处理错误的一种方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数直接或间接的调用者处理这个错误
用户11029103
2025/02/07
1260
【c++】异常
C++异常处理
异常是一个程序执行过程中出现的问题。C++ 异常是对程序运行过程中产生的例外情况作出的响应,比如试图除以零。
软件架构师Michael
2023/08/20
2780
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
在C++编程中,异常处理是一种重要的技术,用于处理程序在运行时可能出现的错误或意外情况。异常是指在程序执行过程中发生的某种不正常的情况,例如除以零、内存访问错误或无效的输入等。传统的错误处理方式通常涉及使用错误代码或返回特殊值来指示问题,但这种方式可能会导致代码混乱、繁琐,并且容易被忽略或处理不当。
枫叶丹
2024/06/04
1070
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析
前言:在编程的浩瀚宇宙中,C++以其卓越的性能、强大的灵活性和对底层硬件的直接控制而著称,是无数开发者心中的瑰宝。然而,在追求高效与极致的路上,错误处理与异常管理往往成为不可忽视的重要环节。C++通过引入异常处理机制,为开发者提供了一套强大而灵活的工具,以优雅地应对程序执行过程中可能遇到的各种异常情况,从而确保程序的健壮性和可靠性
Eternity._
2024/08/09
1.1K0
【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析
项目中你会用C++异常处理吗?
在 C++ 中,异常处理是一种用于处理程序运行过程中发生的错误或异常情况的机制。当程序出现异常情况时,可以使用异常处理机制来捕获、传递和处理异常,以保证程序的稳定性和可靠性。
Linux兵工厂
2024/04/01
2140
项目中你会用C++异常处理吗?
【C++】异常之道,行者无疆:解锁 C++ 的异常捕获哲学
C语言中的 strerror 将参数对应 errno 的错误信息的字符串返回。errno 是一个全局变量,当使用标准库的函数发生错误时,就会将对应的的错误码放到 errno 中,每个错误码对应着不同的错误信息,strerror 就可以将错误码对应的字符串返回。 以下为错误码 0~10 对应的信息:
HZzzzzLu
2024/12/26
2790
【C++】异常之道,行者无疆:解锁 C++ 的异常捕获哲学
【c++】c++异常&&c++的异常处理详解
实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误
用户10925563
2024/08/06
1670
【c++】c++异常&&c++的异常处理详解
C++异常处理机制
实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
南桥
2024/09/20
990
C++异常处理机制
[C++] 异常
异常机制是一种重要的错误处理方法,可以帮助程序在运行时检测并处理问题,从而提高程序的可靠性和可维护性。C++异常机制的核心思想是:将错误检测和错误处理分离,从而让程序结构更清晰。
DevKevin
2024/11/17
820
[C++] 异常
【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
1. 异常是通过抛出对象来激活的,该对象的类型决定了应该激活那个catch的处理代码
GG Bond1
2024/08/09
1540
【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
C++异常
注:实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误
用户9645905
2022/11/30
7240
C++异常
C++异常的介绍和分析
C++11:异常 1.C语言传统的处理错误的方式 与 C++的对比 传统的错误处理机制: 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码 放到errno中,表示错误 C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下 实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。 c++处理方式 使
雪芙花
2022/10/31
8420
C++异常的介绍和分析
C++自定义异常案例
C++ 在 <exception> 中提供了一系列标准的异常,我们可以用在我们的程序中。这些异常使用父-子分层结构展示如下:
软件架构师Michael
2023/08/20
3230
C++:异常
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
二肥是只大懒蓝猫
2023/03/30
7230
C++:异常
C++:异常
实际中 C 语言基本都是使用返回 错误码 的方式处理错误,部分情况下使用终止程序处理非常严重的
啊QQQQQ
2024/11/19
800
C++:异常
C++异常
基于以上问题,C++衍生了一种新的处理错误的方式。异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
梨_萍
2023/05/14
4490
C++异常
【C++高阶】:异常详解
🧩·C++针对上面的不足,引入了异常的概念,不会终止程序,并且会将错误信息详细介绍。
IsLand1314
2024/10/15
1530
【C++高阶】:异常详解
【C++修炼之路】31.异常
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
每天都要进步呀
2023/10/16
2440
【C++修炼之路】31.异常
C++ 异常处理深入探讨,一文打通任督二脉!
 则将调用并退出程序。 在 c + + 中,可能会引发任何类型,但是,建议引发直接或间接从 
Lion 莱恩呀
2025/04/18
740
C++ 异常处理深入探讨,一文打通任督二脉!
相关推荐
C++ 异常处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档