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

相关推荐
zhlx28352 小时前
【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
macos·ios·cocoa
saturday-yh3 小时前
性能优化、安全
前端·面试·性能优化
前进别停留12 小时前
206面试题(71~80)
面试
XZHOUMIN13 小时前
网易博客旧文----编译用于IOS的zlib版本
ios
爱吃香菇的小白菜16 小时前
H5跳转App 判断App是否安装
前端·ios
不二人生18 小时前
SQL面试题——飞猪SQL面试 重点用户
数据库·sql·面试
dream_ready18 小时前
四万字长文SpringBoot、Spring、SpringMVC等相关面试题(注:该篇博客将会持续维护 最新维护时间:2024年11月12日)
java·spring boot·后端·spring·面试·1024程序员节
知否&知否20 小时前
Kafka面试夺命连环30问(一)
分布式·面试·kafka
百晓生说测试21 小时前
15:00面试,15:08就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
二流小码农21 小时前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos