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

文章目录

为什么选择 Swift

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

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

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

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

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

如何创建变量和常量

如何创建变量和常量

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

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

swift 复制代码
var greeting = "Hello, playground"

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

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

其中实际上有四种语法:

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

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

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

swift 复制代码
var name = "Ted"
name = "Rebecca"
name = "Keeley"

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

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

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

swift 复制代码
let character = "Daphne"

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

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

swift 复制代码
let character = "Daphne"
character = "Eloise"
character = "Francesca"

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

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

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

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

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

swift 复制代码
var playerName = "Roy"print(playerName)
playerName = "Dani"print(playerName)
playerName = "Sam"print(playerName)

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

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

尽管 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 的字符串以双引号开头和结尾,但引号内的内容由您决定。您可以使用简短的字母文本,如下所示:

swift 复制代码
let actor = "Denzel Washington"

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

swift 复制代码
let filename = "paris.jpg"
let result = "⭐️ You win! ⭐️"

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

swift 复制代码
let quote = "Then he tapped a sign saying \"Believe\" and walked away."

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

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

swift 复制代码
let movie = "A day in
the life of anApple engineer"

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

swift 复制代码
let movie = """
A day in
the life of an
Apple engineer
"""

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

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

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

swift 复制代码
print(actor.count)

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

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

swift 复制代码
let nameLength = **actor**.count
print(nameLength)

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

swift 复制代码
print(result.uppercased())

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

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

swift 复制代码
print(movie.hasPrefix("A day"))

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

swift 复制代码
print(filename.hasSuffix(".jpg"))

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

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

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

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

swift 复制代码
var quote = "Change the world by being yourself"

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

swift 复制代码
var burns = """
The best laid schemes
O' mice and men
Gang aft agley
"""

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

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

如何存储整数

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

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

swift 复制代码
let score = 10

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

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

swift 复制代码
let reallyBig = 100000000

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

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

swift 复制代码
let reallyBig = 100_000_000

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

swift 复制代码
let reallyBig = 1_00__00___00____00

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

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

例如:

swift 复制代码
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:

swift 复制代码
var counter = 10
counter = counter + 5

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

swift 复制代码
counter += 5print(counter)

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

swift 复制代码
counter *= 2print(counter)
counter -= 10print(counter)
counter /= 2print(counter)

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

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

swift 复制代码
let number = 120print(number.isMultiple(of: 3))

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

swift 复制代码
print(120.isMultiple(of: 3))

如何存储十进制数

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

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

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 不会允许您将两者放在一起。

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

swift 复制代码
let a = 1
let b = 2.0
let c = a + b

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

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

swift 复制代码
let c = a + Int(b)

或者将 Int 内部 a 视为 Double

swift 复制代码
let c = Double(a) + b

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

所以:

swift 复制代码
let double1 = 3.1
let double2 = 3131.3131
let double3 = 3.0
let int1 = 3

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

swift 复制代码
var name = "Nicolas Cage"
name = "John Travolta"

但是这种代码不是:

swift 复制代码
var name = "Nicolas Cage"
name = 57

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

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

swift 复制代码
var rating = 5.0
rating *= 2

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

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

相关推荐
调皮的芋头1 小时前
iOS各个证书生成细节
人工智能·ios·app·aigc
coooliang2 小时前
【iOS】SwiftUI状态管理
ios·swiftui·swift
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
小小码农(找工作版)4 小时前
JavaScript 前端面试 4(作用域链、this)
前端·javascript·面试
uhakadotcom6 小时前
约束求解领域的最新研究进展
人工智能·面试·架构
超爱吃士力架8 小时前
MySQL 三层 B+ 树能存多少数据?
java·后端·面试
超爱吃士力架8 小时前
MySQL 索引的最左前缀匹配原则是什么?
java·后端·面试
LiuMingXin8 小时前
埋头苦干Vue3项目一年半,总结出了16个代码规范
前端·vue.js·面试
胖虎18 小时前
深入解析 iOS 视频录制(三):完整录制流程的实现与整合
ios·音视频·cocoa·ios视频录制·自定视频录制
coooliang8 小时前
【iOS】包大小和性能稳定性优化
ios