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

Swift中? 、! 和 ??

作者头像
赵哥窟
发布于 2020-08-17 08:03:14
发布于 2020-08-17 08:03:14
1.6K00
代码可运行
举报
文章被收录于专栏:日常技术分享日常技术分享
运行总次数:0
代码可运行

Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型声明后加一个 ? 操作符完成的。 例如: var name: String?

Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None , 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。这里是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的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if name { 
// 有值再操作
}

在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,如果是nil值,也就是Optional.None,会跳过后面的操作不执行,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性。

? 的使用场景:

1.声明Optional值变量 2.用在对Optional值操作中,用来判断是否能响应后面的操作 3.使用 as? 向下转型

下面声明一个对象Person为可选类型,或者一个可选的String

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var person:Person?
var str:String?
var num:NSNumber!

可选类型 可以不用初始化,如果不是可选类型,必须在init下进行初始化。保证在调用的时候不是nil

可选类型在调用的时候必须加上?或者!,声明的时候用的!的可以不加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 let str:String! = "Hello"
        let greeting = "World!"
        if str != nil {
          let message = str + " " + greeting
          print(message)
}

声明的时候用的?需要加上!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let str:String? = "Hello"
        let greeting = "World!"
        if str != nil {
            let message = str! + " " + greeting
            print(message)
 }

??是取两个中不为nil的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let helloStr:String? = nil
let x = helloStr ?? "Hello World!"
print(x)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Swift之 ? 和 !
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错:
JoeyBlue
2021/09/07
5120
Swift基础语法(一)
Swift语言是苹果公司在Apple WWDC 2014上退出的,用来撰写MacOS和iOS应用程序。
拉维
2020/05/22
4.3K0
swift 基础语法(常量、变量、数值、布尔型、元组)
常量和变量必须在使用之前声明 使用let关键字声明常量 使用var关键字声明变量
xy_ss
2023/11/22
1770
Swift3.0 - 真的很简单
中文翻译文档 https://github.com/numbbbbb/the-swift-programming-language-in-chinese
酷走天涯
2018/09/14
8780
Swift3.0 - 真的很简单
现代的新语言–Swift初探
WWDC简短的介绍,新的语言Swift就问世了,尽管新语言的名字导致贴吧下歌手粉丝和开发人员们争抢地盘- -,只是雨燕就是这么来了。
全栈程序员站长
2022/07/12
7670
Swift基础语法(四)
在Swift5之前,我们一般是采用上面的方式来处理异常,在Swift5之后,苹果推出了一个Result枚举,Result枚举可以更加优雅地去处理异常。
拉维
2020/07/06
4K0
Swift基础语法(四)
【面试必备】Swift 面试题及其答案
答案:optional类型被用来表示任何类型的变量都可以表示缺少值。在Objective-C中,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。
编程怪才-凌雨画
2021/01/26
2.8K0
【面试必备】Swift 面试题及其答案
Swift-?-!
上面了解到的是普通值,接下来Optional值要上场了。Optional其实是个enum,里面有None 和Some两种类型。其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会 通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值) 的原因,也是Playground会把Optional值显示为类似{Some”hello world”}的原因,这里是 enum Optional的定义:
用户3004328
2018/09/06
9070
46 道 Swift 常见面试题解
3、Set 独有的方法有哪些? 4、实现一个 min 函数,返回两个元素较小的元素 5、map、filter、reduce 的作用 6、map 与 flatmap 的区别 7、什么是 copy on write 8、如何获取当前代码的函数名和行号 9、如何声明一个只能被类 conform 的 protocol 10、guard 使用场景 11、defer 使用场景 12、String 与 NSString 的关系与区别 13、怎么获取一个 String 的长度 14、如何截取 String 的某段字符串 15、throws 和 rethrows 的用法与作用 16、try?和 try!是什么意思 17、associatedtype 的作用 18、什么时候使用 final 19、public 和 open 的区别 20、声明一个只有一个参数没有返回值闭包的别名
Swift社区
2021/11/26
5.3K0
【面试必备】Swift 面试题及其答案
答案:optional 类型被用来表示任何类型的变量都可以表示缺少值。在 Objective-C 中,引用类型的变量是可以缺少值,并且使用 nil 作为缺少值。基本的数据类型如 int 或者 float 没有这种功能。
Swift社区
2021/11/26
7K0
Swift 5.6到5.10新特性整理
当你编写涉及共享状态的代码时,如果你不确保这个共享状态在跨线程使用时是安全的,你就会在许多地方遇到数据竞争的问题。
小刀c
2024/04/03
2.2K0
Swift 5.6到5.10新特性整理
iOS:swift :可选类型
import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil
用户1941540
2018/05/11
1.2K0
Swift 3到5.1新特性整理
Swift 5.0 最重要的自然是ABI Stability, 对此可以看这篇 Swift ABI 稳定对我们到底意味着什么 。
小刀c
2022/08/16
4.8K0
Swift 3到5.1新特性整理
swift 构造器
使用构造器来实现构造过程,构造器可以看做是用来创建新实例的特殊方法,与OC的构造器不同,之前是先调用父类的init再写自己的, 但是到了Swift里面, 我们却先初始化自己, 再初始化父类, 是相反的,swift中构造器无需返回值,主要任务是保证新实例在第一次使用前完成正确的初始化
xy_ss
2023/11/22
1910
swift  构造器
Swift基础 可选链条
翻译自:https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html
郭顺发
2023/07/17
1270
Swift学习笔记
这是一篇学习swift的笔记 Objective-C是很好的语言,Runtime机制、消息机制等也是爱不释手。 Swift一直在更新,闲暇时间学一遍。学习的Blog:《从零开始学swift》 以下代码全部在playground进行的尝试 变量 let 是常量 var 是变量 不能修改的使用常量可以提高程序的可读性。 var str = "Hello, playground" print(str) let constA:Int = 12 let constB = 12 let constC = 12
落影
2018/04/27
1.4K0
Swift学习笔记
Swift教程(一)--基础内容
Swift是一个全新的用户iOS,MacOS,watchOS和tvOS的应用编程语言。如果你有C和Objective-C开发经验的话,Swift的许多部门会让你很熟悉。
roc
2019/07/31
1.3K0
Swift学习:可选型的使用
第一部分:可选型要点 可选类型顾名思义。它表示一个变量有可能有值,也可能没有值(nil)。 可选类型类似于OC指针的nil值,但是OC中的nil只对类有用,而可选择型中nil对所有类型都可用,更安全
梧雨北辰
2018/04/24
1.1K0
Swift基础 自动参考计数
翻译自:https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
郭顺发
2023/07/17
1300
Swift解读专题一——Swift2.2语言预览
        本系列专题是我通过阅读Swift2.2语言开发文档,翻译总结加上自己的理解整理而成。其中大部分结构和内容都来自开发文档,有疏漏和错误之处,还望更多朋友指出,共同交流进步,我的QQ:316045346。
珲少
2018/08/15
2.1K0
相关推荐
Swift之 ? 和 !
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验