IOS Swift 从入门到精通:Swift 简介,Swift中变量和常量,Swift中字符串,Swift中整数和浮点数

文章目录

  • 为什么选择 Swift
  • 如何创建变量和常量
    • 如何创建变量和常量
    • 为什么 Swift 有常量和变量?
  • 如何创建字符串
    • 为什么 Swift 需要多行字符串?
  • 如何存储整数
  • 如何存储十进制数

为什么选择 Swift

编程语言有很多,但我认为你会非常喜欢学习 Swift。这部分是出于实际原因——你可以在 App Store 上赚很多钱!——但也有很多技术原因。

您会看到,Swift 是一种相对年轻的语言,仅在 2014 年推出。这意味着它没有旧语言可能存在的许多语言垃圾,并且通常意味着只有一种方法来解决特定问题。

与此同时,作为一种新型编程语言,Swift 充分利用了旧语言成功之处(有时也包括错误之处)的各种新理念。例如,Swift 很难意外编写不安全的代码,它使编写清晰易懂的代码变得非常容易_,_并且它支持世界上所有的语言,因此您永远不会看到困扰其他语言的那些奇怪的字符错误。

Swift 本身只是一种语言,并非设计用于在屏幕上绘制任何东西。在使用 Swift 构建软件时,您将使用 SwiftUI:Apple 的强大框架,可创建文本、按钮、图像、用户交互等等。顾名思义,SwiftUI 是为 Swift 构建的 - 它旨在利用该语言提供的强大功能和安全性,这使得构建真正强大的应用程序变得非常快。

所以,你应该学习 Swift,因为你可以用它赚很多钱,而且它还能很好地完成很多事情。没有繁琐,没有混乱,只有触手可及的强大功能。有什么不喜欢的呢?

如何创建变量和常量

如何创建变量和常量

无论何时编写程序,您都需要存储一些数据。可能是用户刚刚输入的姓名,可能是您从互联网上下载的一些新闻报道,也可能是您刚刚执行的复杂计算的结果。

Swift 为我们提供了两种存储数据的方式,具体取决于您是否希望数据随时间而变化。当您创建新的 Playground 时,会自动使用第一种选项,因为它将包含以下行:

var greeting = "Hello, playground"

这会创建一个名为的新变量 greeting,因为它是一个变量,所以它的值可以_变化_——它可以随着程序的运行而改变。

提示: macOS 游乐场中的另一行是 import Cocoa,它引入了 Apple 提供的大量代码,使应用程序构建更加容易。 其中包括许多重要功能,因此请不要删除它。

其中实际上有四种语法:

  • var 关键字的意思是“创建一个新变量”;它节省了一些输入。
  • 我们将变量命名为 greeting。您可以将变量命名为任何您想要的名称,但大多数情况下,您会希望使其具有描述性。
  • 等号为变量赋值。如果不想,等号两边可以不加空格,但这是最常见的样式。
  • 我们分配的值是文本“Hello, Playground”。请注意,文本写在双引号内,以便 Swift 可以看到文本的开始和结束位置。

如果你使用过其他语言,你可能会注意到我们的代码不需要在行尾使用分号。Swift 允许使用_分号_,但这种情况很少见——只有当你出于某种原因想要在同一行编写两段代码时,你才会需要它们。

当你创建一个变量时,你可以随时间改变它:

var name = "Ted"
name = "Rebecca"
name = "Keeley"

这将创建一个名为 的新变量 name,并赋予其值“Ted”。然后它被更改了两次,第一次是“Rebecca”,然后是“Keeley”——我们不再使用它,var 因为我们修改的是现有变量,而不是创建新变量。您可以根据需要多次更改变量,每次都会丢弃旧值。

(欢迎您在变量中放入不同的文本,但我是电视节目 Ted Lasso 的忠实粉丝,所以我选择了 Ted。是的,您可以在后续章节中期待其他 Ted Lasso 参考资料和更多内容。)

如果您不想更改值,则需要使用常量_。_创建常量与创建变量几乎完全相同,只是我们使用 let 而不是 var,如下所示:

let character = "Daphne"

在,当我们使用时,let 我们创建一个_常量_,即无法改变的值。Swift 确实不允许我们这样做,如果我们尝试这样做,则会显示一个大错误。

不相信吗?尝试将其放入 Xcode 中:

let character = "Daphne"
character = "Eloise"
character = "Francesca"

再次强调,第二行和第三行中没有 let 关键字,因为我们没有创建新的常量,我们只是试图更改已有的常量。但是,就像我说的,这样做是行不通的——您无法更改常量,否则它就不是常量了!

如果你好奇的话,“let” 来自数学世界,人们会说“让 x 等于 5”之类的话。

**重要提示:**请删除显示错误的两行代码——您确实无法改变常量!

在学习 Swift 时,您可以让 Xcode 打印出任何变量的值。在实际应用中,您不会经常使用此功能,因为用户看不到打印的内容,但作为查看数据内容的简单方法,它确实很有用。

例如,我们可以在每次设置变量时打印出它的值——尝试将其输入到你的操场中

var playerName = "Roy"print(playerName)
playerName = "Dani"print(playerName)
playerName = "Sam"print(playerName)

提示:您可以通过点击左侧的蓝色播放图标在 Xcode 操场中运行代码。如果您沿着蓝色条带向上或向下移动,您会看到播放图标也会移动 - 这可让您根据需要将代码运行到某个点,但大多数时候您需要运行到最后一行。

您可能已经注意到,我将变量命名为 playerName,而不是 playernameplayer_name 或其他替代名称。这是一种选择:Swift 并不真正关心您_如何_命名常量和变量,只要您在任何地方都以相同的方式引用它们即可。因此,我不能使用 playerNamefirst then playernamelater —— Swift 将这两个视为不同的名称。

尽管 Swift 并不关心我们如何命名数据,但我使用的命名风格是 Swift 开发人员的标准——我们称之为约定_。_如果你好奇,这种风格被称为“驼峰式命名法”,因为名称中的第二个和后续单词的大写字母都以一个小凸起开头:

let managerName = "Michael Scott"
let dogBreed = "Samoyed"
let meaningOfLife = "How many roads must a man walk down?"

如果可以的话,最好使用常量而不是变量——这不仅使 Swift 有机会更好地优化您的代码,而且还允许 Swift 确保您不会意外更改常量的值。

为什么 Swift 有常量和变量?

变量是程序中存储临时数据的好方法,但 Swift 为我们提供了第二个更好的选择:常量。它们在各个方面都与变量相同,但有一个重要区别:一旦设置,我们就无法更改它们的值。

Swift 非常喜欢常量,事实上,如果你创建了一个变量,但从未改变过它的值,那么 Swift 会建议你使用常量。这样做的原因是为了避免出现问题:你创建的任何变量都可以随时随地被你更改,因此你会失去一些控制权——你储存的重要用户数据可能会在未来的任何时候被删除或替换。

一旦设置了常量,我们就不能再更改它们,所以这有点像与 Swift 签订的合同:你说“这个值很重要,无论我做什么都不能改变它。”当然,你可以尝试用变量来做同样的约定,但键盘上的一次失误就可能把事情搞砸,而 Swift 也无法提供帮助。通过使用常量,只需更改 varlet,你就可以要求 Swift 确保值永远不会改变,这是另一件你不再需要担心的事情。

如何创建字符串

当您将文本分配给常量或变量时,我们将其称为字符串_-_想象一下将一堆拼字游戏牌串在一根绳子上形成一个单词。

Swift 的字符串以双引号开头和结尾,但引号内的内容由您决定。您可以使用简短的字母文本,如下所示:

let actor = "Denzel Washington"

您可以使用标点符号、表情符号和其他字符,如下所示:

let filename = "paris.jpg"
let result = "⭐️ You win! ⭐️"

你甚至可以在字符串中使用其他双引号,只要你小心在它们前面加上反斜杠,这样 Swift 就会明白它们是在字符串_内部,而不是结束_字符串:

let quote = "Then he tapped a sign saying \"Believe\" and walked away."

不用担心 - 如果您漏掉了反斜杠,Swift 一定会大声喊出您的代码不太正确。

字符串的长度没有实际限制,这意味着您可以使用字符串来存储非常长的内容,例如莎士比亚全集。但是,您会发现 Swift 不喜欢字符串中有换行符。因此,不允许使用这种代码:

let movie = "A day in
the life of anApple engineer"

这并不意味着您_不能_创建跨多行的字符串,只是 Swift 需要您对它们进行特殊处理:不是在字符串的两边使用一组引号,而是使用三个,如下所示:

let movie = """
A day in
the life of an
Apple engineer
"""

这些多行字符串并不经常使用,但至少你可以看到它是如何完成的:开始和结束的三重引号在它们自己的行上,而你的字符串位于中间。

创建字符串后,您会发现 Swift 为我们提供了一些有用的功能来处理其内容。随着时间的推移,您将更多地了解此功能,但我想在这里向您介绍三件事。

.count 首先,您可以通过在变量或常量的名称后写入来读取字符串的长度:

print(actor.count)

因为 actor 有文字“Denzel Washington”,所以会打印 17 个——名字中的每个字母一个,加上中间的空格。

如果不想,则不需要直接打印字符串的长度 - 您可以将其分配给另一个常量,如下所示:

let nameLength = **actor**.count
print(nameLength)

第二个有用的功能是 uppercased(),它返回相同的字符串,只是其中的每个字母都大写:

print(result.uppercased())

是的,这里需要开括号和闭括号,但不需要_。count 随着你的学习,原因会变得更加清晰,但在你学习 Swift 的早期阶段,最好这样解释区别:如果你要求 Swift 读取一些数据,则不需要括号,但如果你要求 Swift 执行一些工作,则需要。_这并不完全正确,你稍后会了解到,但这足以让你现在继续前进。

最后一个有用的字符串功能称为 hasPrefix(),它让我们知道字符串是否以我们选择的某些字母开头:

print(movie.hasPrefix("A day"))

还有一个**hasSuffix()**对应物,它检查字符串是否以某些文本结尾:

print(filename.hasSuffix(".jpg"))

重要提示: Swift 中的字符串区分大小写,这意味着使用**filename.hasSuffix(“.JPG”)**将返回 false,因为字符串中的字母是小写的。

字符串在 Swift 中非常强大,而我们仅仅触及了它们的皮毛!

为什么 Swift 需要多行字符串?

Swift 的标准字符串以引号开头和结尾,但不得包含任何换行符。例如,这是一个标准字符串:

var quote = "Change the world by being yourself"

对于小段文本,这种方法效果很好,但如果要存储大量文本,源代码就会变得难看。这就是多行字符串的作用所在:如果使用三引号,则可以根据需要将字符串写在多行中,这意味着文本在代码中仍然易于阅读:

var burns = """
The best laid schemes
O’ mice and men
Gang aft agley
"""

Swift 将字符串中的换行符视为文本本身的一部分,因此该字符串实际上包含三行。

提示 :有时,您会希望在代码中使用长字符串文本,但又不想使用多行代码,但这种情况很少见。具体来说,如果您打算与他人共享代码,这一点通常非常重要 - 如果他们看到程序中的错误消息,他们可能会在代码中搜索该消息,而如果您将其拆分为多行,他们的搜索可能会失败。

如何存储整数

当您处理诸如 3、5、50 或 500 万之类的整数时,您处理的是 Swift 所称的_整数_,或 Int 简称“整数” – 如果您好奇的话,“整数”最初是一个拉丁词,意思是“整体”。

创建新整数的工作原理与创建字符串一样:使用 let 或 (var 具体取决于您想要常量还是变量),提供名称,然后为其赋值。例如,我们可以 score 像这样创建一个常量:

let score = 10

整数可以非常大——超过十亿、数万亿、数千万亿,甚至_数千万亿_,但它们也可以非常小——它们可以容纳高达数千万亿的负数_。_

当你手写数字时,可能很难看清楚到底发生了什么。例如,这个数字是多少?

let reallyBig = 100000000

如果我们手写的话,我们可能会写成“100,000,000”,这样就很清楚这个数字是 1 亿。Swift 有类似的东西:你可以使用下划线 ,**_**来随意拆分数字。

因此,我们可以将之前的代码改成这样:

let reallyBig = 100_000_000

Swift 实际上并不关心下划线,所以如果你愿意的话可以这样写:

let reallyBig = 1_00__00___00____00

最终结果相同:reallyBig 设置为值为 100,000,000 的整数。

当然,你也可以使用在学校学到的算术运算符,从其他整数创建整数:**+ 加法、-**减法、***乘法和/**除法。

例如:

let lowerScore = score - 2
let higherScore = score + 10
let doubledScore = score * 2
let squaredScore = score * score
let halvedScore = score / 2
print(score)

Swift 并不是每次都创建新的常量,而是有一些特殊的操作,以某种方式调整整数并将结果分配回原始数字。

例如,这将创建一个 counter 等于 10 的变量,然后向其添加 5:

var counter = 10
counter = counter + 5

除了写 counter = counter + 5,您还可以使用简写运算符**+=**,该运算符直接将数字添加到所需的整数中:

counter += 5print(counter)

这样做的作用完全相同,只是输入的内容更少。我们称这些为_复合赋值运算符_,它们还有其他形式:

counter *= 2print(counter)
counter -= 10print(counter)
counter /= 2print(counter)

在介绍完整数之前,我想提最后一件事:与字符串一样,整数也具有一些有用的功能。例如,您可以调用**isMultiple(of:)**一个整数来查明它是否是另一个整数的倍数。

因此,我们可以像这样询问 120 是否是 3 的倍数:

let number = 120print(number.isMultiple(of: 3))

我**isMultiple(of:)**在这里调用一个常量,但是如果你愿意的话,你可以直接使用该数字:

print(120.isMultiple(of: 3))

如何存储十进制数

当您处理 3.1、5.56 或 3.141592654 等十进制数时,您处理的是 Swift 所称的_浮点数_。这个名字源于计算机存储数字的出奇复杂的方式:它试图将非常大的数字(例如 123,456,789)存储在与非常小的数字(例如 0.0000000001)相同的空间中,而它能做到这一点的唯一方法是根据数字的大小移动小数点。

这种存储方法导致十进制数对于程序员来说是一个众所周知的问题,您只需两行 Swift 代码就可以体验一下这一点:

let number = 0.1 + 0.2
print(number)

运行该程序时,它不会打印 0.3。相反,它会打印 0.30000000000000004 – 即 0.3,然后是 15 个零,然后是 4,因为……好吧,就像我说的,它很复杂。

我稍后会进一步解释_为什么_它很复杂,但首先让我们关注重要的事情。

首先,当您创建一个浮点数时,Swift 会将其视为 Double。这是“双精度浮点数”的缩写,我意识到这是一个相当奇怪的名字——多年来我们处理浮点数的方式发生了很大变化,尽管 Swift 在简化这一点方面做得很好,但您有时可能会遇到一些更复杂的旧代码。在这种情况下,这意味着 Swift 分配的存储空间是一些旧语言的两倍,这意味着可以 Double 存储绝对庞大的数字。

其次,Swift 将小数视为与整数完全不同的数据类型,这意味着您不能将它们混合在一起。毕竟,整数总是 100% 准确,而小数则不是,因此除非您明确要求,否则 Swift 不会允许您将两者放在一起。

实际上,这意味着你不能执行诸如将整数加到小数之类的操作,所以这种代码会产生错误:

let a = 1
let b = 2.0
let c = a + b

是的,我们_可以看到这 b 实际上只是伪装成小数的整数 2,但 Swift 仍然不允许该代码运行。这称为_类型安全:Swift 不会让我们意外混合不同类型的数据。

如果你希望这种情况发生,你需要明确告诉 Swift 它应该将 Double 内部 b 视为 Int

let c = a + Int(b)

或者将 Int 内部 a 视为 Double

let c = Double(a) + b

第三,Swift 根据您提供的数字来决定是否要创建 或 Double——如果其中有一个点,则为,否则为。 是的,即使点后的数字为 0。IntDoubleInt

所以:

let double1 = 3.1
let double2 = 3131.3131
let double3 = 3.0
let int1 = 3

结合类型安全,这意味着一旦 Swift 决定了常量或变量保存的数据类型,它就必须始终保存相同的数据类型。这意味着此代码没有问题:

var name = "Nicolas Cage"
name = "John Travolta"

但是这种代码不是:

var name = "Nicolas Cage"
name = 57

这告诉 Swiftname 将存储一个字符串,但随后它会尝试在其中放入一个整数。

最后,十进制数具有与整数相同的运算符范围和复合赋值运算符:

var rating = 5.0
rating *= 2

许多较旧的 API 使用一种略有不同的方式存储十进制数,称为 CGFloat。幸运的是,Swift 允许我们在需要 Double 的任何地方使用常规数字,因此尽管您有时会看到 a 出现,但您可以忽略它。CGFloatCGFloat

如果您好奇的话,浮点数之所以复杂,是因为计算机试图使用二进制来存储复杂的数字。例如,如果您将 1 除以 3,我们知道您会得到 1/3,但这无法以二进制存储,因此系统设计为创建非常接近的近似值。它非常高效,而且错误非常小,通常无关紧要,但至少您知道为什么 Swift 不允许我们意外混合使用 IntDouble

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

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

相关文章

Chained Together卡顿严重怎么办 链在一起卡顿频繁的解决方法

链在一起/Chained Together这款游戏特别适合四个人一起玩,游戏里四个玩家将会被锁链“链在一起”,然后一起在各个地图闯关,不仅考验玩家们的默契配合,还考验智慧和勇气。在链在一起中,玩家需要根据地形和岩浆的分布情况…

anconda创建虚拟环境不在安装目录下

解决方案参考 解决新创建的anaconda环境在C:\Users\xxx\.conda\envs\,而不在anaconda安装目录下的envs中_anaconda加载已创建的环境文件夹在哪-CSDN博客

Ubantu安装docker

Ubantu安装docker 本文只演示ubantu安装docker,环境为Ubantu22.04,ubantu需要自行安装 注:如果FinalShell无法连接Ubantu,可以尝试 sudo apt install openssh-server # 安装ssh启动服务 sudo systemctl start ssh # 启动 【1】卸…

淘宝订单物流信息获取:详细操作指南

一、前言 淘宝作为中国最大的电商平台之一,其订单管理系统为商家提供了丰富的接口,用于查询、管理和跟踪订单信息。本指南将详细介绍如何通过淘宝订单接口获取物流信息,帮助商家更好地管理订单和提供优质的物流服务。 二、获取物流信息的步…

SVG 直线

SVG 直线 SVG(可缩放矢量图形)是一种用于描述二维图形的语言,它基于 XML 格式。在 SVG 中,直线是一种基本的图形元素,用于创建简单的线条。本文将详细介绍 SVG 直线的用法,包括如何创建直线、设置直线的样式和属性,以及如何在实际项目中使用直线。 1. 创建 SVG 直线 …

php框架的文档和社区支持如何?

在选择 php 框架时,文档和社区支持至关重要,拥有全面的文档和庞大活跃的社区,而 symfony 的文档内容丰富但更适合高级开发人员。codeigniter 4 的文档易于理解,社区规模较小但活跃。yii 2 的文档全面深入,但格式可能令初学者困惑。…

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板,黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

allegro 打开 brd文件时提示 WARNING(SPMHDB-212) 告警 应该如何解决呢?

WARNING(SPMHDB-212) :This design has functionality disabled due tothe current product plus options selected. The following features aredisabled: Maximum Crosstalk, Maximum Peak Crosstalk. [help] 步骤 按下图 将allegro编辑器为可设计高速线相关的…

Elastisearch集群(单节点)

目录 一、文件下载 二、创建linux es用户 三、上传、解压canal、es、kibana 四、配置es通讯证书(生成证书给es配置使用) 五、配置elastisearch 六、修改系统配置 七、添加ik分词器支持(可选) 八、给文件赋值权限 九、设置…

比较Freemaker和Nuxt.js作为CMS模板语言的特点

在开发内容管理系统(CMS)时,选择合适的模板语言至关重要。本文将讨论Freemarker和Nuxt.js这两种常用模板语言的特点,以帮助开发者选择最适合其项目需求的工具。 Freemarker的特点 Freemarker是一个基于Java的模板引擎&#xff0…

71-TCP协议工作原理及实战

一 服务器端 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> // 专门用于建立TCP连接并传输数据信息 #include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE namespace Ui { class M…

164万年后的日期解析引发的OOM

名词解释 商家销项发票业务&#xff08;平台给商家开票&#xff09;&#xff0c;是平台提供给商家的工具产品&#xff0c;商家购买了平台的服务&#xff0c;那么平台需要开票给商家。 前言 本文所描述的问题&#xff0c;是应用的OOM引发的接口成功率下跌&#xff0c;排查过程中…

改进YOLO系列 | 谷歌团队 | CondConv:用于高效推理的条件参数化卷积

CondConv&#xff1a;用于高效推理的条件参数化卷积&#xff08;中文综述&#xff09; 简介 YOLO系列目标检测算法以其速度和精度著称&#xff0c;但其推理速度仍然存在提升空间。 谷歌团队提出的CondConv&#xff08;Conditional Parameterized Convolution&#xff09;是一…

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架&#xff0c;用于评估基于大型语言模型&#xff08;LLM&#xff09;的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率&#xff0c;以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

webgis 之 地图投影

地图投影 什么是地图投影目的种类等角投影的分类墨卡托投影Web 墨卡托投影 参考小结 为了更好地展示地球上的数据&#xff0c;需要将地球投影到一个平面上。地图投影是一个数学问题&#xff0c;按照一定的几何关系&#xff0c;将地球上的经纬度坐标映射到一个平面上的坐标。地球…

力扣hot100:(The Last one)287. 寻找重复数(快慢指针,静态链表)

LeetCode&#xff1a;287. 寻找重复数 “暴力” 不懂技巧&#xff0c;那就暴力&#xff01; 哈希表&#xff1a; 时间复杂度&#xff1a; O ( n ) O(n) O(n) 这个题体现不出 O ( n ) O(n) O(n)的作用&#xff0c;因为 n < 100 n < 100 n<100 空间复杂度&…

区块链技术介绍和用法

区块链技术是一种分布式账本技术&#xff0c;可以记录和存储一系列交易信息&#xff0c;并通过密码学算法保证信息的安全性和不可篡改性。区块链技术的核心概念是“区块”和“链”。 每个区块包含了一部分交易信息&#xff0c;以及一个指向上一个区块的哈希值。当新的交易发生…

VirtualBox出错,从主机复制文件,乱改内容

昨天烧录机器&#xff0c;测试对方更新的一个库&#xff1a; 开始正确。后来莫名其妙崩溃。反复烧了几次&#xff0c;都错误。复制了老版本的库&#xff0c;正常。再改回新版本&#xff0c;崩溃。 于是把整个打包目录给了对方&#xff0c;他一对比&#xff0c;发现文件不对&am…

Windows应急响应靶机 - Web2

一、靶机介绍 应急响应靶机训练-Web2 前景需要&#xff1a;小李在某单位驻场值守&#xff0c;深夜12点&#xff0c;甲方已经回家了&#xff0c;小李刚偷偷摸鱼后&#xff0c;发现安全设备有告警&#xff0c;于是立刻停掉了机器开始排查。 这是他的服务器系统&#xff0c;请你…

Springboot获取resources中的文件

1.Springboot以文件的形式获取resources中的文件 import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.springframework.util.ResourceUtils; import j…