Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Swift-?-!

Swift-?-!

作者头像
用户3004328
发布于 2018-09-06 08:51:38
发布于 2018-09-06 08:51:38
92900
代码可运行
举报
文章被收录于专栏:增长技术增长技术
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Swift之 ? 和 !
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错:
JoeyBlue
2021/09/07
5590
Swift| 基础语法(一)
总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift有所帮助,同时也是对自己的一个总结。
進无尽
2018/09/12
1.5K0
Swift| 基础语法(一)
如何在Java和Swift中避免空引用异常?
您最近在代码中遇到过NullPointerException(空指针异常)吗? 如果没有,那你一定是一个很细心的程序员。在Java应用程序中最常见的异常类型之一就是NullPointerExcepti
程序你好
2018/08/01
3.1K0
如何在Java和Swift中避免空引用异常?
Swift中? 、! 和 ??
Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型声明后加一个 ? 操作符完成的。 例如: var name: Stri
赵哥窟
2020/08/17
1.7K0
Swift 基础之可选
C 和 Objective-C 中并没有可选这个概念。最接近的是 Objective-C 中的一个特 性,一个方法要不返回一个对象要不返回 nil,nil 表示“缺少一个合法的对象”。然而,这只 对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选可以让你暗示任意 类型的值缺失,并不需要一个特殊值。
Swift社区
2021/11/26
8590
Swift 基础之可选
iOS:swift :可选类型
import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil
用户1941540
2018/05/11
1.3K0
Swift基础语法(常量变量、数据类型、元组、可选、断言)
本文来自Swift中文开发组,感谢翻译者的分享。 本文将分几部分对Swift对ios的语法做讲解。本文为第一节,主要讲解基础语法。 常量和变量 常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串"Hello")关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。 声明常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试
xiangzhihong
2018/02/05
2.1K0
Swift基础语法
本文来自Swift中文开发组,感谢翻译者的分享。 本文将分几部分对Swift对iOS的语法做讲解。本文为第一节,主要讲解基础语法。 常量和变量 常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串”Hello”)关联起来。常量的值一旦设定就不能改变,而变量的值可以随意更改。 声明常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试
xiangzhihong
2018/01/26
1.5K0
Swift解读专题一——Swift2.2语言预览
        本系列专题是我通过阅读Swift2.2语言开发文档,翻译总结加上自己的理解整理而成。其中大部分结构和内容都来自开发文档,有疏漏和错误之处,还望更多朋友指出,共同交流进步,我的QQ:316045346。
珲少
2018/08/15
2.2K0
Swift 基本语法02-"let"和"var"
一个iOS开发初级菜鸡.png Swift 基本语法01-Swift简介 Swift 基本语法03-"if let"和"guard let" Swift 基本语法04-"switch"和"for" Swift 基本语法05-"String" Swift 基本语法06-数组和字典 1.let(常量)和var(变量)可选项的默认值 1.1 let(常量)的可选项没有默认值 1> 常量在使用之前要被初始化 let y: Int// Constant 'y' used before being initia
用户1890628
2018/05/10
8570
Swift教程(一)--基础内容
Swift是一个全新的用户iOS,MacOS,watchOS和tvOS的应用编程语言。如果你有C和Objective-C开发经验的话,Swift的许多部门会让你很熟悉。
roc
2019/07/31
1.3K0
【面试必备】Swift 面试题及其答案
答案:optional 类型被用来表示任何类型的变量都可以表示缺少值。在 Objective-C 中,引用类型的变量是可以缺少值,并且使用 nil 作为缺少值。基本的数据类型如 int 或者 float 没有这种功能。
Swift社区
2021/11/26
7.2K0
Swift Reference Cycle中的weak,unowned,Closure Capture List
如果您在用Swift做iOS开发,且暂时不是很清楚什么时候用weak、什么时候用unowned、或者不是很清楚什么是closure capture list,那么,此文尚值一读。
iOS Development
2019/02/14
1.1K0
【面试必备】Swift 面试题及其答案
答案:optional类型被用来表示任何类型的变量都可以表示缺少值。在Objective-C中,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。
编程怪才-凌雨画
2021/01/26
3K0
【面试必备】Swift 面试题及其答案
swift 基础语法(常量、变量、数值、布尔型、元组)
常量和变量必须在使用之前声明 使用let关键字声明常量 使用var关键字声明变量
xy_ss
2023/11/22
2630
使用 Swift 提高代码质量
京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。
Swift社区
2021/11/26
4.9K0
使用 Swift 提高代码质量
自学Swift之路(一)UI入手之基本控件
本系列文章都是以有OC基础来写的,所以注释不会写太多,对基础不够了解的同学可能不太适合,另外本系列文章不是以教程式的形式来写,是记录学习过程的,所以不会有多少讲解 第一步:创建工程 A62A869C-
清墨
2018/05/07
3.1K0
自学Swift之路(一)UI入手之基本控件
Swift 中的属性包装器
当处理代表某种状态形式的属性时,通常会在每次修改值时触发某种关联的逻辑。例如,我们可以根据一组规则验证每个新值,可以以某种方式转换分配的值,或者每当值更改时都可以通知一组观察者。
韦弦zhy
2021/04/08
2.9K0
Swift| 基础语法(五)
总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift有所帮助,同时也是对自己的一个总结。
進无尽
2018/09/12
2.4K0
Swift| 基础语法(五)
swift4.0语法杂记(精简版)
一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入swift语言的研发,于2014年发布这一语言的第一版本。swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是增添了一些新特性。这些新特性需要在Xcode9上运行才能显示出效果。值得一提的是它支持unicode9,也就是说,可以用某些图片图标来充当变量。
谦谦君子修罗刀
2018/05/02
15.8K0
swift4.0语法杂记(精简版)
相关推荐
Swift之 ? 和 !
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验