Swift中可选变量?与!讲解

swift语言学习 swift的可选类型用于处理变量可能为nil(空值)即缺失的情况。在swift中,可选类型通过在原始类型后面添加问号(?)来声明(注意:类型与?之间没有空格)。例如以下的这两个声明是相同的:这两种情况,都可以声明变量为可选整数类型变量.同时显示声明也可以如。 阅读详情
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错:
  1. var stringValue : String  
  2. //error: variable 'stringValue' used before being initialized 
  3. //let hashValue = stringValue.hashValue 
  4. //                            ^ 
  5. 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的定义:
  1. enum Optional<T> : LogicValue, Reflectable { 
  2.     case None 
  3.     case Some(T) 
  4.     init() 
  5.     init(_ some: T) 
  6.  
  7.     /// Allow use in a Boolean context. 
  8.     func getLogicValue() -> Bool 
  9.  
  10.     /// Haskell's fmap, which was mis-named 
  11.     func map<U>(f: (T) -> U) -> U? 
  12.     func getMirror() -> Mirror 
  13. } 
声明为Optional只需要在类型后面紧跟一个?即可。如:
  1. var strValue : String?  
一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:
  1. if strValue { 
  2.     //do sth with strValue 
  3. } 
然后怎么使用Optional值呢?文档中也有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,“Optional Chaining的问号的意思是询问是否响应后面这个方法,和原来的isResponseToSelector有些类似”,如果是nil值,也就是Optional.None,固然不能响应后面的方法,所以就会跳过,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,比如:
  1. let hashValue = strValue?.hashValue  
strValue是Optional的字符串,如果strValue是nil,则hashValue也为nil,如果strValue不为nil,hashValue就是strValue字符串的哈希值
 
到这里我们看到了?的两种使用场景:
 
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
 
另外,对于Optional值,不能直接进行操作,否则会报错:
  1. //error: 'String?' does not have a member named 'hashValue' 
  2. //let hashValue = strValue.hashValue 
  3. //                ^        ~~~~~~~~~ 
  4.  
  5. let hashValue = strValue.hashValue 
上面提到Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?拆包提到了几种方法,一种是Optional Binding, 比如:
  1. if let str = strValue { 
  2.     let hashValue = str.hashValue 
  3. } 
还有一种是在具体的操作前添加!符号,好吧,这又是什么诡异的语法?!
 
直接上例子,strValue是Optional的String:
  1. let hashValue = strValue!.hashValue 
这里的!表示“我确定这里的的strValue一定是非nil的,尽情调用吧” ,比如这种情况:
  1. if strValue { 
  2.     let hashValue = strValue!.hashValue 
  3. } 
{}里的strValue一定是非nil的,所以就能直接加上!,强制拆包(unwrap)并执行后面的操作。 当然如果不加判断,strValue不小心为nil的话,就会出错,crash掉。
 
考虑下这一种情况,我们有一个自定义的MyViewController类,类中有一个属性是myLabel,myLabel是在viewDidLoad中进行初始化。因为是在viewDidLoad中初始化,所以不能直接声明为普通值:var myLabel : UILabel,因为非Optional的变量必须在声明时或者构造器中进行初始化,但我们是想在viewDidLoad中初始化,所以就只能声明为Optional:var myLabel: UILabel?, 虽然我们确定在viewDidLoad中会初始化,并且在ViewController的生命周期内不会置为nil,但是在对myLabel操作时,每次依然要加上!来强制拆包(?也OK),比如:
  1. myLabel!.text = "text" 
  2. myLabel!.frame = CGRectMake(0, 0, 10, 10) 
  3. ... 
对于这种类型的值,我们可以直接这么声明:var myLabel: UILabel!, 果然是高(hao)大(fu)上(za)的语法!, 这种是特殊的Optional,称为Implicitly Unwrapped Optionals, 直译就是隐式拆包的Optional,就等于说你每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作,当然如果该值是nil,也一样会报错crash掉。
 
那么!大概也有两种使用场景
 
1.强制对Optional值进行拆包(unwrap)
2.声明Implicitly Unwrapped Optionals值,一般用于类中的属性
Swift 打印输出/数据类型/变量输出/可选类型/常量 这里写自定义目录标题1. 打印输出2. 数据类型2.1 字符:Character2.2 可选类型:Optional3. 变量输出4. Swift 可选(Optionals)类型4.1 强制解析4.2 自动解析4.3 可选绑定5. Swift 常量5.1 常量声明5.2 类型标注 1. 打印输出 swift 使用 print 函数打印输出: print("Runoob") // 输出 Runoob 如果我们想让其不换行输出,只需要将最后一个参数赋值为空字符串即可: for x in 0...10{ 阅读详情

相关推荐

Swift中的可选类型 (Optionals)与Objective-C中的nullability注解

Swift:可选类型 (Optionals)

tracy_0215的博客 994

C语言可选性自变量(摘自C语言核心技术)

C语言允许定义自变量数量可变的函数,这称为variadic函数。这样的函数需要固定数目的强制性自变量(mandatory argument),后面是数量可变的可选性自变量。这样的函数必须有“至少一个”强制性自变量。可选性自变量的类型可能会改变,可选性自变量的数量可能由“强制性自变量的值”所决定,或者由“用来定义可选性自变量列表的特殊值”所决定。 C语言中,最有名的variadi函数范例是prin...

weixin_30685029的博客 238

Swift编程进阶:深入理解可选类型与间接拆包

Swift作为Apple公司推出的一种现代编程语言,自2014年问世以来迅速成为了iOS和macOS应用开发的主流语言。Swift以其简洁的语法、强大的性能和安全特性,吸引了全球数百万的开发者。在本章节中,我们将探讨Swift的基本概念、核心特性以及它如何成为开发者优先选择的技术之一。Swift的语法设计旨在提高编程效率和可读性,它的表达式和函数式编程特性使得开发者能够写出更加简洁和表达力强的代码。Swift的强类型系统和编译时安全检查机制则为应用的稳定性提供了保障,有助于避免运行时错误。

weixin_35794316的博客 1011

Swift基础知识:4.Swift可选类型

通过可选绑定、强制解包和可选链式调用等方式,可以安全地访问可选类型的值。在 Swift 中,可选类型是一种特殊的类型,用于表示一个值可能存在,也可能不存在(即为 nil)。在某些情况下,开发者可以确定一个可选类型在之后一定会有值,这时可以使用隐式解析可选类型。要访问可选类型的值,需要对可选类型进行解包。使用可选链式调用来访问可选类型的属性和方法,如果可选类型为 nil,则调用将会返回 nil。来强制解包可选类型,如果可选类型为 nil,则会触发运行时错误。可选类型的变量可以赋值为 nil,表示没有值。

长沙火山 1092

一生一芯预学习:从零搭建Verilator仿真环境与NVBoard实战

本文详细介绍了如何从零搭建Verilator仿真环境,并完成NVBoard实战项目,为'一生一芯'预学习提供完整指导。内容包括环境配置、工具安装、波形生成、自动化构建及可视化调试技巧,帮助初学者快速掌握数字逻辑设计与仿真验证的核心技能。

keras9composer的博客 701

HyperLedger Fabric实战(一):基础环境构建

简介 本文将介绍从一台裸机上面如何构建出一个可用的Fabric网络(单机版,非测试网络)。 基础环境构建 Fabric组件安装

yindarui 1万+

swift变量的可选(Optional)类型

Swift变量的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。 当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为nil。 如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值。但使用操作符!去获取值为nil的可选变量会有运行时错误。 你可以用可选链接和可选绑定选择性执行可

番薯大佬的专栏 1290

音视频开发—H264相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

本文讲述了H264相关概念和原理——GOP概念,SPS与PPS,帧内压缩原理,帧间压缩原理,解释了什么是运动补偿,什么运动矢量等等概念

weixin_46999174的博客 3979

swift中的?和!理解

本文转载至http://www.cnblogs.com/dugulong/p/3770367.html 首先贴cocoachina上某位大大的帖子: Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: ...

a1311010193的博客 196

网络安全实战:从Wireshark到BurpSuite的抓包技巧解析

本文深入解析了Wireshark和BurpSuite在网络安全抓包中的实战技巧,从基础对比到高级过滤、核心模块应用及安全测试避坑指南。通过详细的操作步骤和案例分析,帮助读者掌握数据包抓取与分析的核心技能,提升网络安全防护能力。

weixin_29207533的博客 574

AgentScope Java多智能体框架

AgentScope Java 的核心设计理念是“Agent-Oriented Programming” (面向智能体编程)。

zzz19920821的博客 1740

swift之基本运算符

本章大致介绍一些swift特别的运算符 元组比较 import Foundation /* 元组比较: 1.从左到右比较,一旦比出结果,即大于或小于,就是整体的比较结果 2.如果每个对应的元祖相等,则整体的结果就是相等 3.要比较7个或者更多的元素的元祖,必须实现比较运算符 */ if (1,"zebra")<(2,"apple"){ print("the second win") } i...

VistorsYan的博客 349

Excel下拉公式不自动计算?5步彻底解决!

Excel下拉公式不自动计算?5步彻底解决!在使用Excel处理数据时,公式下拉填充是提升效率的核心操作。但许多用户都遇到过这样的困惑:明明设置了公式,下拉时结果却纹丝不动。本文将从技术原理出发,结合5步实操方案,为您彻底解析这个高频问题的根源与解决方案。

mmoo_python的博客 1万+

swift中的可选类型(?)、强制解析(!)、自动解析、可选绑定、可选链

1. 前言 对于一直用OC的iOS开发者来说,swift的可选类型可算是个新东西。刚开始接触swift的时候,(?), (!), (??)这些符号搞得我好晕,所以我觉得有必要整理出来,让更多的人不晕! 2. 可选类型 2.1 啥叫可选类型? 就是Option类型,用(?)表示。被它修饰的变量,意味着这个变量可能有一个值,也有可能没值 。(让我想起了薛定谔的猫

Ethan_LG的专栏 2522

APM 飞行模式切换--源码详解

APM飞控中有很多种方式可以改变飞行模式。其中最常见的为遥控器切换和地面站切换两种方式。 下面以遥控器切换为例详解飞行模式切换逻辑。 APM遥控器切换飞行模式的源代码在RC_Channel.cpp文件中的RC_Channel_Copter::do_aux_function_change_mode()函数中。 const bool success = copter.set_mode()调用Copter::set_mode()函数,在set_mode()函数中调用mode_fro...

qq_30623591的博客 2440

【系统分析师】高分论文:论面向对象设计方法及应用

本文以某市职业院校合并后的信息化系统建设项目为例,探讨了面向对象设计方法在系统开发中的应用。作为系统分析师,作者在415.6万元、6个月工期的项目中,通过遵循单一职责原则(简化构件库)、依赖倒置原则(开发公共接口)和开闭原则(构件扩展)等设计原则,成功完成了5个子系统融合改造和4个智慧实训室建设。项目采用J2EE分层设计和SOA架构,最终在2022年11月顺利上线,提升了教学管理效率,获得用户好评。文章总结了设计原则对提高系统复用性、可维护性的重要作用,同时也反思了部署过程中的经验教训。

数据知道的博客 7955

【Swift】 Swift 基础语法:变量、类型、分支与循环

本文介绍了Swift语言的基础语法,主要包括变量与常量的声明、数据类型、可选类型和控制流结构。Swift使用let声明常量,var声明变量,支持类型推断;提供整数、浮点数、布尔、字符和字符串等基本数据类型,均为值类型。可选类型(Optional)是Swift特有的安全机制,可通过强制解析、可选绑定等方式处理可能为nil的值。控制流包括if-else条件判断和switch语句(支持多种匹配模式),以及for-in循环用于遍历区间和集合。这些基础语法体现了Swift的安全性、简洁性和强大的类型系统。

Antonio915的博客 1257

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Swift 可选(Optionals)类型讲解

Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS 应用程序。 Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。 Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的: ...

weixin_43226231的博客 678

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Swift 可选(Optionals)类型

Swift 可选类型(Optionals)核心解析 可选类型是 Swift 空安全机制的核心,表示变量可能有值也可能为 nil。相比传统语言的空指针崩溃风险,Swift 强制开发者处理 nil 情况。 关键特性: 声明方式:String? 表示可选字符串 解包方式:强制解包(!)、可选绑定(if/guard let)、空合运算符(??)、可选链(?.) 最佳实践:优先使用安全解包方式,避免强制解包 典型应用场景: 安全获取嵌套数据(user?.profile?.avatarURL) 提供默认值(userna

m0_57545130的博客 861

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Swift初见】Swift可选值Optionals

我们用oc开发的时候,经常会遇到null值的情况,如果不加任何判断的话可能会导致程序崩溃,swift语言添加了可选值这样的概念,基本语法如下: 可选类型: var optValue: Int? = 8 在类型后面加一个?表示optValue这个值可以为nil,"?"就是可选值的一个标记,?其实是一个Optionals的类型,我们可以看看swift的源码: enum Optional : R

weasleyqi的专栏 2849

Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么?首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量。var stringValue = "5" var intValue = stringValue.toInt(); println("intvalue = \(intValue)")执行以上方法后得到了奇怪的结果:intvalue = Optional(5)其

KT的iOS开发小站 3842

使用Swift 3创建iOS应用:变量,常量和可选

Swift中的变量是一个基本而强大的语言概念。 尽管它们看起来很简单,但是它们包含许多功能,并且在进行Swift编程时也会遇到一些常见的陷阱。 在这本有关使用Swift 3创建iOS应用程序的课程中,这部简短的视频教程中,我将解释变量,常量和可选参数,特别着重于Swift类型系统。 使用Swift 3创建iOS应用:变量,常量和可选 Swift 3中的变量 Swift在变量方面具有一些...

代码教主 264

Swift5基础之可选项

可选项 可选项,一般也叫可选类型,它允许将值设置为nil,在类型名称后面加个问号? 来定义一个可选项。 //变量定义 var name:String? = "Jack" name = nil var age: Int? // 默认就是nil age = 10 age ...

liuyinghui523的专栏 519

Swift_可选类型(Optionals)

说明: 文中提到的”构造器”和Object_C中的”初始化”类似. 博文中的代码仅为讲解知识, 没有成型的项目Demo. 资料链接Swift2.0(中文版) 举例: (构造过程–默认构造器) 代表前面的文字出自”构造过程”这章中的”默认构造器”小节. 建议看一看Swift2.0中的(基础部分– 可选, nil, if语句以及强制解析, 可选绑定, 隐私解析可选类型) 和 (构

Sponge_CMZ的博客 2022

5、swift开发iOS——可选类型

Swift 可选(Optionals)类型 Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。

dearbaba_8520的博客 201

Swift2:可选类型

使用可选类型(optionals)来处理值可能缺失的情况 C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回 nil,nil 表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 NSNo...

bangbanJun的博客 147
上一篇: iOS设计指南
YimanFly
博客等级 码龄12年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值