Swift--量值与基本数据类型

系列文章目录

第一章: Swift–量值与基本数据类型


文章目录

  • 系列文章目录
  • 前言
    • `对学习过程做一个记录`
  • 变量和常量
    • 命名规范
    • 注释
  • 元祖类型
  • 可选类型
    • 拆包
  • typealias


前言

对学习过程做一个记录

提示:以下是本篇文章正文内容,下面案例可供参考

变量和常量

俩关键字letvar
他们的作用都是为某一个具体量值取了一个名称,也叫量值的声明

//声明一个变量str并为他赋值为Hello world
var str = "hello world"
//上边一行代码和下边两行代码等价//先声明字符串变量
var str: String
//对字符串变量赋值
str = "hello, world"

为量值指定类型:在常量或变量名后加冒号,在冒号后指定类型
Swift是一种类型安全语言,即常量或者变量在声明的时候必须指定明确的类型。看到这里,读者可能会有一些疑问,为何在Xcode生成的模板代码中没有指定str变量的类型,系统依然没有报错,原因要归功于Xcode编译器,Xcode编译器支持对Swift语言的类型自动推断,当声明变量时,如果直接给变量赋初值,则编译器会根据赋值的类型来确定变量的类型,之后变量的类型将不可更改。


//更改str的值
str = "hello"
//在str后追加
str = str + "world" + str//声明三个变量并让编译器推断他们的类型
var a = 1, b = 2, c = "string"
//声明三个变量并指定他们的类型
var a2: Int = 1, b2:Float = 2.3, c2:String = "string"

//在同一行代码中声明多个变量并切没有提供初始值,可以通过指定最后一个变量的类型对整体进行类型指定
//声明三个Int类型的变量
var one, two, three: Int

Switf允许我们省略分号来自动换行,也允许我们一行内写多句代码,这个时候就要使用分号来分割

如果要对变量重新赋值,要注意所赋值的类型必须和变量的类型保持一致请添加图片描述

命名规范

简而言之,使用驼峰命名法

注释

和OC一样,但Swift可以进行注释的嵌套

元祖类型

元组允许一些并不相关的类型自由组合成为新的集合类型
元组类型类似于日常生活中的套餐

//创建一个元组,其中有两种类型,字符串类型和整数类型
var pen:(name:String, price:Int) = ("pen", 2)
//获取元祖的pen的名称
var name = pen.name//创建一个不指定参数名称的元祖
var car:(String, Int) = ("奔驰", 20)
//通过下标来取元祖中的各个元素的值
var name = car.0//创建一个不指定参数名称的元祖
var car:(String, Int) = ("奔驰", 20)
//进行元祖分解
//这个时候theName被赋值为“奔驰,thePrice被赋值为20
var (theName, thePrice) = car

分解后的变量必须与元组中的元素一一对应(个数相等),否则编译器就会报错
请添加图片描述
也可以将某些不需要获取的元素使用匿名的方式来接收
请添加图片描述
使用符号“”来表示匿名的概念,因此“”也被称为匿名标识符

可选类型

可选值类型(Optional类型)是Swift语言特有的一种类型。首
先,Swift语言是一种十分强调类型安全的语言,开发者在使用到某个变量时,编译器会尽最大可能保证此变量的类型和值的明确性,保证减少编程中的不可控因素。然而在实际编程中,任何类型的变量都会遇到值为空的情况,在Objective-C语言中并没有机制来专门监控和管理为空值的变量,程序的运行安全性全部靠开发者手动控制。Swift语言提供了一种包装的方式来对普通类型进行Optional包装,实现对空值情况的监控。请添加图片描述
在Swift语言中,未做初始化的普通类型是不允许使用的,哪怕是用来进行判空处理也不被允许,当然也就不可以与nil进行比较运算.因此,开发者在使用前必须保证变量被初始化

那如果我们需要它为空怎么办呢?这个时候就把它包装成可选类型请添加图片描述
这个时候就不会报错了
在声明obj变量的时候,这里将其声明成了String?类型,在普通类型后面添加符号“?”,即可将普通类型包装为Optional类型。

Optional类型不会独立存在,其总是附着于某个具体的数据类型之上

拆包

“?”符号可以出现在类型后面,也可以出现在实例后面,如果出现在类型后面,其代表的是此类型对应的Optional类型,如果出现在实例后面,则代表的是可选链的调用。“!”符号同样可以出现在类型后面与实例后面,它出现在类型后面代表的是一种隐式解析的语法结构


//声明obj为String?类型
var obj:String? = "hs"
//进行拆包
obj!

在使用“!”进行Optional值的拆包操作时,必须保证要拆包的值不为nil,否则程序运行会出错
可以在拆包前使用if语句进行安全判断

//声明obj为String?类型
var obj:String? = "hs"
//进行拆包
if obj != nil {obj!
}

Swift语言还提供了一种if-let语法结构来进行Optional类型值的绑定操作

var obj:String? = "hs"
//进行if-let判断
if let tmp = obj {print(tmp)
} else {obj = "hs"print(obj!)
}

如果obj有值,则if-let结构将创建一个临时常量tmp来接收obj拆包后的值,并且执行if为真时所对应的代码块,在执行的代码块中,开发者可以直接使用拆包后的obj值tmp。如果obj为nil,则会进入if为假的代码块中,开发者可以在else代码块中将obj重新赋值使用。这种if-let结构实际上完成了判断、拆包、绑定拆包后的值到临时常量3个过程

if-let结构中也可以同时进行多个Optional类型值的绑定,之间用逗号隔开


var obj1:Int? = 1
var obj2:Int? = 2
if let tmp1 = obj1, let tmp2 = obj2 {print(tmp1,tmp2)
}

在同时进行多个Optional类型值的绑定时,只有所有Optional值都不为nil,绑定才会成功,代码执行才会进入if为真的代码块中
如果开发者需要在if语句的判断中添加更多业务逻辑,可以通过追加子句的方式来实现

var obj1:Int? = 1
var obj2:Int? = 2
if let tmp1 = obj1, let tmp2 = obj2,  tmp1 < tmp2{print(tmp1,tmp2)
}

隐式解析。隐式解析适用于这样的场景:当我们明确某个变量初始时为nil,并且在之后使用之前一定会被赋值时,我们可以将其声明为隐式解析的可选值,再对这个变量进行使用,就不需要进行拆包操作了在这里插入图片描述
因为obj没有拆包请添加图片描述


//将obj4声明为隐式解析的变量
var obj4:Int!
obj4 = 3
//在使用的时候,不用进行拆包操作,Swift会自动帮我们拆包
print(obj4 + 1)

typealias

在C、C++、Objective-C这些语言中都提供了typedef这样的关键字来为某个类型取一个别名,Swift语言中使用typealias关键字来实现相同的效果

//为Int类型取一个别名price
typealias price = Int
//使用price代替Int,效果完全一样
var price1: price = 100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/170136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传统企业数字化转型都要面临哪些挑战?_数据治理平台_光点科技

数字化转型已经成为传统企业发展的必经之路&#xff0c;但在这个过程中&#xff0c;企业往往会遭遇多方面的挑战。 1.文化和组织惯性 最大的挑战之一是企业文化和组织惯性的阻力。传统企业往往有着深厚的历史和根深蒂固的工作方式&#xff0c;员工和管理层可能对新的数字化工作…

SQL 存储过程优化

问题&#xff1a;一个复杂的6个表的left jion 语句&#xff0c;发现设置为定时任务后最高时长为18分钟 1、原因分析&#xff1a;对复杂SQL 进行拆分验证 发现是合同明细表和 产品表的left jion 时间过长&#xff0c;发现 合同明细表每天为3w条&#xff0c;之前做过优化 对每个…

基于JavaWeb+SpringBoot+Vue摩托车商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue摩托车商城微信小程序系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 近年来&#xff0c;随着移动互联网的快速发展&#xff0c;电子商务越来越受到…

【Linux】Linux动态库和静态库

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈

在NPU/GPU上进行模型训练计算&#xff0c;为了充分使用计算资源&#xff0c;一般采用批量数据处理方式&#xff0c;因此一般情况下为提升整体吞吐率&#xff0c;batch值会设置的比较大&#xff0c;常见的batch数为256/512&#xff0c;这样一来&#xff0c;对数据预处理处理速度…

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案&#xff0c;它由三个核心组件组成&#xff1a; Elasticsearch&#xff1a;作为分布式搜索和分析引擎&#xff0c;Elasticsearch能够快速地存储、搜索和分析大量的日志数据&#xff0c;帮助用户轻松地找到所需的信息。 Logstash&#xf…

php在线审稿系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 php在线审稿系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php在线审稿系统 代码 https://download.csdn.net/download/qq_41221322/885…

接口自动化测试实操【设置断言思路】

1 断言设置思路 这里总结了我在项目中常用的5种断言方式&#xff0c;基本可能满足90%以上的断言场景&#xff0c;具体参见如下脑图&#xff1a; 在这里插入图片描述 下面分别解释一下图中的五种思路&#xff1a; 1&#xff09; 响应码 对于http类接口&#xff0c;有时开发人…

Day28力扣打卡

打卡记录 给小朋友们分糖果 II&#xff08;容斥原理&#xff09; 链接 大佬的题解 def c2(n: int) -> int:return n * (n - 1) // 2 if n > 1 else 0class Solution:def distributeCandies(self, n: int, limit: int) -> int:return c2(n 2) - 3 * c2(n - limit …

深度学习的集体智慧:最新发展综述

一、说明 我们调查了来自复杂系统的想法&#xff0c;如群体智能、自组织和紧急行为&#xff0c;这些想法在机器学习中越来越受欢迎。人工神经网络正在影响我们的日常生活&#xff0c;从执行预测性任务&#xff08;如推荐、面部识别和对象分类&#xff09;到生成任务&#xff08…

应用开发平台集成表单设计器系列之2——深入了解与技术验证

背景 上一篇&#xff0c;对表单设计器进行了技术预研&#xff0c;在三款组件form-generator、FormMaking、form-create-designer中初步选择了form-create-designer&#xff0c;接下来的工作&#xff0c;是需要深入了解&#xff0c;进行技术验证&#xff0c;确保该组件功能基本…

ROS 学习应用篇(三)服务Server学习之Server

话题Topic是订阅器与发布器节点之间的&#xff0c;而服务则是客户端&#xff08;Client&#xff09;和服务器&#xff08;Server&#xff09;间的&#xff0c;前者是异步的&#xff0c;后者是同步的。而且话题是单项的不需要服务器上线&#xff0c;而服务是双向的。在开启服务之…