当前位置: 首页 > news >正文

【Swift】类型标注、类型安全和类型推断

文章目录

  • 类型标注
  • 类型安全和类型推断
    • 什么是类型安全和类型推断
    • 为什么说Swift是一门安全语言
    • 类型安全带来的好处

类型标注

当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。

var constantName:<data type> = <optional initial value>

这个例子给 welcomeMessage 变量添加了类型注解,表示这个变量可以存储 String 类型的值:

/*
声明中的冒号代表着“是...类型”,所以这行代码可以被理解为:
声明一个类型为 String ,名字为 welcomeMessage 的变量。
类型为 String ”的意思是“可以存储任意 String 类型的值。
*/
var welcomeMessage: String//welcomeMessage 变量现在可以被设置成任意字符串:
welcomeMessage = "Hello"print(welcomeMessage);

※注意:
一般来说你很少需要写类型注解。如果你在声明常量或者变量的时候赋了一个初始值,Swift 可以推断出这个常量或者变量的类型,请参考 类型安全和类型推断。在上面的例子中,没有给 welcomeMessage 赋初始值,所以变量 welcomeMessage 的类型是通过一个类型注解指定的,而不是通过初始值推断的。


类型安全和类型推断

什么是类型安全和类型推断

Swift 是一个类型安全(type safe)的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个 String,你绝对不可能不小心传进去一个 Int。

由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。

当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。

因为有类型推断,和 C 或者 Objective-C 比起来 Swift 很少需要声明类型。常量和变量虽然需要明确类型,但是大部分工作并不需要你自己来完成。

当你声明常量或者变量并赋初值的时候类型推断非常有用。当你在声明常量或者变量的时候赋给它们一个字面量(literal value 或 literal)即可触发类型推断。(字面量就是会直接出现在你代码中的值,比如 42 和 3.14159 。)

例如,如果你给一个新常量赋值 42 并且没有标明类型,Swift 可以推断出常量类型是 Int ,因为你给它赋的初始值看起来像一个整数:

// meaningOfLife 会被推测为 Int 类型
let meaningOfLife = 42

同理,如果你没有给浮点字面量标明类型,Swift 会推断你想要的是 Double:

// pi 会被推测为 Double 类型
let pi = 3.14159

※注意:
当推断浮点数的类型时,Swift 总是会选择 Double 而不是 Float
如果表达式中同时出现了整数和浮点数,会被推断为 Double 类型。

//原始值 3 没有显式声明类型,而表达式中出现了一个浮点字面量,所以表达式会被推断为 Double 类型
let anotherPi = 3 + 0.14159
//此段代码不报错,但无法给age赋值
var age = 30.0;
age = 30;
print("type of age: \(type(of: age)); age value: \(age)");

以上代码输出结果为:

type of age:Double; age value:30.0

为什么说Swift是一门安全语言

  • 类型推断、类型判断、类型转换
    • 严格的类型要求:在Swift中,变量和表达式的类型必须在编译时被确定。这意味着开发者在编写代码时,需要明确或让编译器能够推断出每个变量和表达式的类型。
    • 编译时类型检查:Swift的编译器会对代码进行严格的类型检查。如果代码中存在类型不匹配的情况,编译器会将其标记为错误,并阻止程序的编译。这有助于开发者在开发阶段更早地发现并修复类型相关的错误。
  • 可选值、可选绑定
    当一个变量可能没有值的时候,我们会定义这个变量为optional变量,默认系统会赋值nil。当我们在使用可选值的时候 一般都用if let 或 guard let 做一个可选绑定。避免对nil进行后续的操作导致错误
  • 自动引用计数
    自动引用计数机制是针对引用类型而言的,像结构体,枚举,元组等值类型是没有这一说的。循环引用的产生,weak及unowned使用
  • 内存安全
    如何注意规避内存访问冲突,尤其注意inout参数及值类型mutating 函数时self的使用,以及闭包捕获情况下
  • 访问控制
    模块框架内部,默认访问权限是internal。像其它4个访问控制关键字分别为open、public、fileprivate、private。不同的场景下如何选择访问关键字,以及怎么决定访问控制关键字

类型安全带来的好处

  • 提高代码质量:
    类型安全有助于减少运行时错误,因为大部分类型错误都会在编译时被捕获和修正。这提高了代码的稳定性和可靠性。
  • 增强代码可读性:
    明确的类型声明和类型推断使得代码更加易于理解和维护。其他开发者在阅读代码时,可以更容易地理解每个变量和表达式的类型及其用途。
  • 促进团队协作:
    在大型项目中,类型安全有助于团队成员之间的协作。因为类型错误会在编译时被捕获,所以团队成员可以更加专注于逻辑实现和功能开发,而无需担心类型不匹配导致的编译失败。

相关文章:

【Swift】类型标注、类型安全和类型推断

文章目录 类型标注类型安全和类型推断什么是类型安全和类型推断为什么说Swift是一门安全语言类型安全带来的好处 类型标注 当你声明常量或者变量的时候可以加上类型标注&#xff08;type annotation&#xff09;&#xff0c;说明常量或者变量中要存储的值的类型。如果要添加类…...

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…...

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…...

单条推理转批量推理prompt

为了将单条推理程序改为批量推理程序&#xff0c;并实现您的要求&#xff0c;我们需要进行以下步骤&#xff1a; 输入的图片和视频都是随机从视频文件夹、图片文件夹挑选&#xff0c;组成输入对&#xff1a; 需要编写一个函数来读取指定文件夹中的所有图片和视频文件。 使用随…...

网络安全审计概述与分类

目录 网络安全审计概述等保五个级别对审计要求网络安全审计系统组成网络安全审计系统类型 网络安全审计概述 4A分别是认证、授权、账号、审计 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储分析和利用的工作。 网络安全审计的作用在于建立“事后”…...

【已解决】“EndNote could not connect to the online sync service”问题的解决

本人不止一次在使用EndNote软件时遇到过“EndNote could not connect to the online sync service”这个问题。 过去遇到这个问题都是用这个方法来解决&#xff1a; 这个方法虽然能解决&#xff0c;但工程量太大&#xff0c;每次做完得歇半天身体才能缓过来。 后来再遇到该问…...

数据脱敏工具:基于 FFmpeg 的视频批量裁剪

在数据处理和隐私保护领域&#xff0c;数据脱敏是一项重要的任务&#xff0c;尤其是在处理包含敏感信息的视频数据时。本文介绍了一种使用 Python 和 FFmpeg 实现的视频批量裁剪工具&#xff0c;该工具可以将视频中的敏感区域裁剪掉&#xff0c;从而实现数据脱敏。通过使用 PyI…...

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之&#xff1a;Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…...

「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解

本篇将详细介绍 Cangjie 中的浮点类型&#xff0c;包括浮点数的表示方法、精度、舍入与溢出处理、科学计数法表示、字面量的进制表示、常用运算、类型转换及应用场景&#xff0c;帮助开发者掌握浮点数的使用方法。 关键词 浮点类型表示精度与舍入溢出与下溢科学计数法类型转换…...

【UGUI】Unity 背包系统实现02:道具信息提示与显示

在游戏开发中&#xff0c;背包系统是一个常见的功能模块&#xff0c;用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统&#xff0c;包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。 1. 功能需求清单 在实现背包系…...

掌握移动端性能测试利器:深入JMeter手机录制功能

引言 在当今移动互联网时代&#xff0c;应用程序的性能和用户体验至关重要。为了确保应用程序在不同设备和网络环境下都能稳定运行&#xff0c;性能测试成为了不可或缺的一环。Apache JMeter作为一款强大的开源性能测试工具&#xff0c;不仅支持传统的PC端性能测试&#xff0c…...

springboot010大学生入学审核系统的设计与实现(源码+包运行+LW+技术指导)

项目描述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本站是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c…...

Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行

一、前言说明 在地图应用中&#xff0c;有很多时候是需要断网环境中离线使用的&#xff0c;一般会采用两种做法&#xff0c;一种是只下载好离线瓦片地图&#xff0c;然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持&#xff0c;只需要拿到瓦片即可&…...

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发

从繁琐到优雅&#xff1a;用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中&#xff0c;尤其是使用 PyTorch 时&#xff0c;我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库&#xff0c;帮助…...

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图&#xff0c;这里要引入C的面向对象思想&#xff0c;建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…...

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…...

【vim】使用 gn 组合命令实现搜索选中功能

gn是Vim 7.4新增的一个操作&#xff08;motion&#xff09;&#xff0c;作用是跳到并选中下一个搜索匹配项。 具体说&#xff0c;Vim里执行搜索后&#xff0c;执行n操作只会跳转到下一个匹配项&#xff0c;而不选中它。但是我们往往需要对匹配项执行一些修改操作&#xff0c;例…...

【Python刷题】广度优先搜索相关问题

题目描述 小A与小B 算法思路 小A一次移动一步&#xff0c;但有八个方向&#xff0c;小B一次移动两步&#xff0c;只有四个方向&#xff0c;要求小A和小B最早的相遇时间。用两个队列分别记录下小A和小B每一步可以走到的位置&#xff0c;通过一个简单的bfs就能找到这些位置并…...

竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】

Hello&#xff0c;这里是Easy数模&#xff01;以下idea仅供参考&#xff0c;无偿分享&#xff01; 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析&#xff0c;评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...

早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现

背景 预训练语言模型已经成为了现代自然语言处理pipeline中的基石&#xff0c;因为其在少量的标注数据上产生更好的结果。随着ELMo、ULMFiT、GPT和BERT的开发&#xff0c;使用预训练模型在下游任务上微调的范式被广泛使用。随后发现预训练语言模型在没有任何额外训练的情况下任…...

二分查找题目:有序数组中的单一元素

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;有序数组中的单一元素 出处&#xff1a;540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...

springboot基于Android的华蓥山旅游导航系统

摘 要 华蓥山旅游导航系统是一款专为华蓥山景区设计的智能导览应用&#xff0c;旨在为用户提供便捷的旅游信息服务。该系统通过整合华蓥山的地理信息、景点介绍、交通状况等数据&#xff0c;实现了对景区的全面覆盖。用户可以通过该系统获取实时的旅游资讯、交流论坛、地图等。…...

面向对象编程(OOP)深度解析:思想、原则与应用

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 面向对象编程&#xff08;OOP&#xff09;深度解析&#xff1a;思想、原则与应用 一、面向对象编程的基本…...

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”&#xff0c;Jeff Pu在报告中提到&#xff0c;我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的&#xff0c;那么将有几个值得注意的方面。 首先&#xff0c;iPhone…...

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本&#xff0c;本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍

AMD和英伟达是目前市场上最主要的两大显卡品牌&#xff0c;它们各有自己的特点和优势&#xff0c;也有不同的适用场景和用户群体。那么&#xff0c;AMD显卡和英伟达显卡到底哪个好&#xff1f;它们之间有什么区别&#xff1f;我们又该如何选择呢&#xff1f;本文将从以下几个方…...

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…...

为什么verilog中递归函数需要定义为automatic?

直接上代码 module automatic_tb;reg [7:0] value;initial begin #0 value < 8d5;#10 $display("result of automatic: %0d", factor_automatic(value));$display("result of static: %0d", factor_static(value));#50 $stop; endfunction reg[7:0] fa…...

23种设计模式-状态(State)设计模式

文章目录 一.什么是状态模式&#xff1f;二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图&#xff1a; 状态设计模式类图 一.什么是状态模式&#xff1f; 状态模式&#xff08;State Pattern&…...

容桂做网站/北京十大教育培训机构排名

let userId dsf.getCookie("userId");...

网站seo工程师怎么做/如何推广软件

菜鸟教程命令大全 http://www.runoob.com/linux/linux-command-manual.html 命令大全: http://man.linuxde.net/ tab &#xff1a;自动补全 Ctrll 清屏 (类似于clear命令) CtrlU 清空当前输入 ctrlc 关闭 man command 帮助 man &#xff1a;manual &#xff1a; 手工&…...

成品网站nike源码1688/今日小说排行榜百度搜索风云榜

MaterialRatingBar 项目地址&#xff1a;DreaminginCodeZH/MaterialRatingBar简介&#xff1a;与 Google 系应用设计相同、支持拉伸、修正原生实现诸多问题的星级评分条。可直接替换 RatingBar。Material Design RatingBar with better appearance, compatible with Android 3.…...

深圳网站建设模板/百度人工服务热线电话

实现element表格导出为excel表格 vue使用elementUI&#xff0c;做出来的表格需要导出为excel表格。 1、安装相关依赖 cnpm install --save xlsx file-saver 2、组件里头引入(项目多处运用,可放到main.js当中) import FileSaver from ‘file-saver’ import XLSX from ‘xl…...

罗湖中心区做网站/今日新闻热点大事件

具体代码&#xff1a;&#xff08;代码放在UI上&#xff0c;该UI添加了BoxCollider&#xff09;效果如下&#xff1a;...

淘宝上做网站的客服聊天技巧/网站seo快速排名优化

阅读第七章所得&#xff1a; 第七章——MSF。MSF是一种微软推荐的软件开发方法。其基本原则有&#xff0c;推动信息共享与沟通&#xff0c;为共同的远景二工作、充分授权与信任、各司其职并对项目共同负责、交付增量的价值、保持敏捷预期和适应变化、投资质量、学习所有经验和与…...