#Day2-- 卖药仔是我!你想要用哪种盒子装?

前言

我记得我之前在Medium写文的时候,刚开始提到的就是「药与盒子」的概念。所谓的药就是被指派的值,而盒子就是外面宣告的变数或常数。而关於「药与盒子」的概念,其实也就是一种比喻而已,希望透过这个比喻能让自己再重复的理解程序语言的运作过程中,是有思考脉络可循的。但其实把要装在盒子里是一个还不错概念,用以描述程序语言对“值”的存在的探讨。

基本资料储存

有值

在「有值」的这个范畴,我们会有两种类型的储存方式,也就是所谓的Constant、Variable,这两者的区别其实非常直观,就是经过宣告後:一个是不可变的,一个是可变的

常数(let...)

常数具有不可变性
let box = "Medicine"

变数(var...)

变数具有可变性
var box = "Medicine"

Optional(介於有值与没有值之间)

通常大家也许不会在第一章的型态的时候提到所谓的Optional可选的问题,但我想既然大家都知道所谓的有值有两种方式可以呈现,所以相反的,我们也会面对到一个问题是「到底有没有值?」,於是介於有与无之间的描述,在Swift程序语言中,便会以“?”这个符号去诠释介於有与无(nil)之间的暧昧状态。

如果在上一个部分,我们是以box作为诠释,那Optional的描述会是下面这个样子:

let box = String?

或是

var box = String?

Anyway,其实这也只是描述值的存在与否的表现方式。

而optional作为介於有值或没有值(nil)之间的资料储存型态,最後在运作程序的时候,我们就必须去解决它到底有或者是没有的问题,但这一部分比较复杂些,日後我们再谈。

复杂资料储存型态

除了基本的资料储存型态,Swift还提供了我们处理其他种类的资料储存方式,如:阵列(Array)、集合(Set)、元组(Tuple)、字典(Dictionary)。这四种类别的资料储存型态各有千秋,也视不同的情景去使用它们。

阵列

阵列Array的逻辑:「以整数值index来存取内容,索引值从0到-1(也就是从第一项到最後一项)」

我不知道「查找」这个词适不适合来描述你想使用阵列里的东西时,但这样理解也许比较直观一点。

let name = ["MJ","Minny","Austin"]
let value = name[0] //value = "MJ"

接下来介绍一下阵列的基本用法:

  1. 索引值
    这个时候,就大概可以知道阵列在运作的时候,是可以藉由「索引值」去抓出自己到底想要「哪个位置的值」
    而程序语言的索引值基本上是这样计算的:0代表着第一项,然後第二是1、第三项就2,往後的依此类推……
    不过,阵列的索引值也可以从阵列的尾巴开始算过来,只不过这个时候要由-1开始索引,就会得到阵列的最後一个值,而如果要倒数第二位的话,就是-2…..依此类推

  2. 计算小工具:count
    假若你需要计算阵列里面有多少个东西的话,也可以用count这个函式去处理,可以很快的得到你要的数量资讯,
    如下:

let names = ["MJ","Minny","Austin"]
let count = names.count //count = 3

  1. 取代原先的内容:变数[索引值]
    如果要取代阵列里面的某个内容,像我下面要更改「MJ」好了,我想把它改成Julia,这个时候我就把:变数[索引值]这个地方直接填入我需要的索引值,再带入我要的内容,就会取代了原先的资料。

  2. 阵列新增资料:新增(append)、插入值(insert)
    阵列还有其他的功能,如新增(append)、插入资料(insert),如果是要在阵列的内容里新增资料的话,就用append这个方式,如下所示:
    如果是要在某个地方「插入」资料的话,那除了要标明要插入的资料,也要标明「要插入的位址」,在下面可以发现,插入的位置要用「at:位址」让Swift明白你接下来要把资料放在哪里。

var name = ["MJ","Minny","Austin"]
names.append("JE")
names.insert("Sam",at:1)
//names = ["MJ","Sam","Minny","Austin"]
  1. 删除阵列里面的值
    假若你要删除阵列里面的值,可以用remove这个函式来做这件事情,但跟上面的insert很像,你必须知道自己要删除值的位置。
    而假若你要清空阵列里所有的内容,那使用removeall()这个函数可以很轻松的替你做到这件事情。

集合

集合跟阵列、字典的不同在於集合就是一个涵括所有内容的概念,集合像一个袋子,他把所有的东西装在一起,
但不会跟你讲说你要第几个项目,我拿给你相应的项目(阵列的概念)
or 你跟我讲我关键字,我把对应的东西拿给你(字典的概念)
,你只能问他,这里面有没有A这个东西,他回答有或是没有(集合的概念)
了解它的运作模式,就会知道,集合这个概念就是「从一个袋子里面拿出东西」。

var name:Set = ["MJ","Sam","Minny","Austin","JE"]
names.contains("MJ")

//return true

它跟阵列不一样的地方,在於它没有排序性、没有索引性、不可以有重复项,你只能问它:「存在或不存在?」

不过,集合这个东西同样有所谓的「新增值」与「删除值」的方式:

var name:Set = ["MJ","Sam","Minny","Austin","JE"]
names.insert("Sneakers")

//name = ["MJ","Sam","Minny","Sneakers","Austin","JE"]

上面三个都不一样,也就说明了集合的特性。

删除remove

假若你要删除全部,则可以用names = []的方式进行

var name:Set = "MJ","Sam","Minny","Austin","JE"
name = []

不过,集合这种资料储存方式,还有其他的东西可以探讨,比如像是高中数学曾经在某堂课提到的「集合运算」,也就是所谓的:交集、联集、对称差集、差集

  1. 交集(intersects):取两个集合的共通处
  2. 差集(exclusive):取两个集合共通处之外的部分
  3. 联集(union):两个集合交集与差集的部分
  4. 对称差集(substract):取两个集合其中一集合的差集
    总而言之,这四个集合运算的方式,我们在下面以一些小案例作为解释:
    假若以下面这几个集合为基本案例
var number:Set = [1,2,3,4,5,6,7,8,9,10] //1-10的集合
var odd_number:Set = [1,3,5,7,9] //基数集合
var even_number:Set = [2,4,6,8,10] //偶数集合
var prime_number:Set = [2,3,5,7,9] //质数集合
  1. 交集(intersects)
    取两个集合的共通处
odd_number.interaction(even_number)
//[]空集合
  1. 差集(exclusive)
    取两个集合共通处之外的部分
odd_number.symmetricDifference(prime_number)`
//[1,2,9,11]
  1. 联集(union)
    两个集合交集与差集的部分
odd_number.union(even_number)`
//1-10的集合
  1. 对称差集(substract):取两个集合其中一集合的差集
number.substract(even_number)
//[2,4,6,8,10]

综合言之,集合这个概念从一开始就是「无序」、「不可索引的」、「不可以有重复项」,它跟阵列有很大的差别。但它可以进行所谓的集合运算,这应该算是它的优势。所以之後要资料储存的时候。要记得选择适合的方式储存哦!

元组

引述 100 Day of Swift 对於元组概念的解析:

Both tuples and arrays allow us to hold several values in one variable, but tuples hold a fixed set of things that can’t be changed, whereas variable arrays can have items added to them indefinitely.

元组的概念是:“内容是不可变的,这是它跟阵列不相同之处。”
了解完元组的特性之後,我们可以在下面这里知道,元组的表达方式是()小括弧:

var game = (name:"Hades",year:"2020")
game.name
game.year

game.0
game.1

然後如果要呼叫元组内的资料的话,可以直接指名参数,它就会对应内容出来,或者也可以以项目排序索引:

所以经上述的描绘,阵列、集合、元组三者可以放在一起做一些小比较:
arrays keep the order(有序) and can have duplicates(重复项),
sets are unordered(无序的) and can’t have duplicates(重复项),
tuples have fixed values(固定值) of fixed types(固定型别) inside them.
稍微简述一下阵列、集合、元组三者的区别,可大致有下面的分类

  1. 阵列:有序、可目录索引、可以有重复项
  2. 集合:无序、不可目录索引,但可以询问「存在或不存在」、不可重复
  3. 元组:固定值与固定型别、可目录索引

字典

字典最大的特徵,就是有键值对(key-value),这件事情是前三个资料储存方式都没有的,而依靠键值对的优势,字典可以很快的透过键,来找到值:

var church:[String:String] = ["MJ:HLL","Minny":"Yumen","Austin":"Yumen",]
church["MJ"] //返回HLL
let removeValue = church.removevalue(forKey:"MJ")
//结果会是["Minny":"Yumen","Austin":"Yumen"]

church[:]//删除全部的键值对

如上述,字典在宣告型别的时候,会有两个型别,一个分别是键,一个是值,表达的方式就如这样:[type:type],因此也就表明了该变数里面的内容会是这样的形式,无论你宣告它里面的型别是什麽。

由键取值
而假若你要取用值的话,那可以用变数[key]的这个方式去找到你的值。

删除资料
删除特定资料可以用removevalue(forKey: ) 这个函式来做
如果要删除所有东西,就以变数[:]就可以达到全部都删除,这样的动作。

字典与默认值
字典还有个比较特殊的功能,就是当我们可能在字典里面查找东西的时候,出现nil的情况,也就是说,我的键可能对不到值,这时候就可以用default(默认)的方式来进行调整,而不是让它的内容回传nil(没有值)

var grade = [
"chinese",
"English",
"History"
]

let geography = grade["geography",default:0]

综合上述,字典的特徵就是可以用键值对操作资料。
以下再次的复习资料储存方式的特色:

  1. 阵列:有序、可索引、可有重复项目
  2. 集合:无序、不可索引,但可询问存在或不存在、无重复项目
  3. 元组:经宣告为元组後,不可改变值与型别
  4. 字典:有键值对可以搜寻资料,可透过键(key)搜寻值(value)
tags: 铁人赛

<<:  [素食吃到饱 vegetarian food] 天菜丰巢 VeGood 蔬食百汇(台中-文心秀泰)半自助晚餐 SHOWTIME LIVE TAICHUNG WENXIN STORE

>>:  [Day-02] - Annotation Modulize Introduction

Day07:部门与工程团队间协作的技巧(上)

一、前言   所谓的团队合作,我想最重要的就是如何沟通与使用有效之协作工具!沟通属於较偏人性与软性之...

musl libc 简介与其 porting(一)

musl libc的起源为当时glibc於设计上有诸多不足之处,例如全静态连结因NSS机制而有状况、...

Day21:21 - 结帐服务(5) - 後端 - 结帐 X PayPal Python Checkout SDK

Salom,我是Charlie! 在Day20的时候我们完成了createOrder跟Capture...

第30天:终於撑到完赛QQ-JavaScript技术手册阅读笔记

四开四个主题实在太累,JavaScript技术手册阅读笔记这个主题就是读这本书买很久的书,顺便把之前...

Day 19 ( 中级 ) 阵列点灯 ( 动画 )

阵列点灯 ( 动画 ) 教学原文参考:阵列点灯 ( 动画 ) 这篇文章延续「阵列点灯 ( 显示图形 ...