我记得我之前在Medium写文的时候,刚开始提到的就是「药与盒子」的概念。所谓的药就是被指派的值,而盒子就是外面宣告的变数或常数。而关於「药与盒子」的概念,其实也就是一种比喻而已,希望透过这个比喻能让自己再重复的理解程序语言的运作过程中,是有思考脉络可循的。但其实把要装在盒子里是一个还不错概念,用以描述程序语言对“值”的存在的探讨。
在「有值」的这个范畴,我们会有两种类型的储存方式,也就是所谓的Constant、Variable,这两者的区别其实非常直观,就是经过宣告後:一个是不可变的,一个是可变的。
常数具有不可变性
let box = "Medicine"
变数具有可变性
var box = "Medicine"
通常大家也许不会在第一章的型态的时候提到所谓的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"
接下来介绍一下阵列的基本用法:
索引值
这个时候,就大概可以知道阵列在运作的时候,是可以藉由「索引值」去抓出自己到底想要「哪个位置的值」
而程序语言的索引值基本上是这样计算的:0代表着第一项,然後第二是1、第三项就2,往後的依此类推……
不过,阵列的索引值也可以从阵列的尾巴开始算过来,只不过这个时候要由-1开始索引,就会得到阵列的最後一个值,而如果要倒数第二位的话,就是-2…..依此类推
计算小工具:count
假若你需要计算阵列里面有多少个东西的话,也可以用count这个函式去处理,可以很快的得到你要的数量资讯,
如下:
let names = ["MJ","Minny","Austin"]
let count = names.count //count = 3
取代原先的内容:变数[索引值]
如果要取代阵列里面的某个内容,像我下面要更改「MJ」好了,我想把它改成Julia,这个时候我就把:变数[索引值]这个地方直接填入我需要的索引值,再带入我要的内容,就会取代了原先的资料。
阵列新增资料:新增(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"]
集合跟阵列、字典的不同在於集合就是一个涵括所有内容的概念,集合像一个袋子,他把所有的东西装在一起,
但不会跟你讲说你要第几个项目,我拿给你相应的项目(阵列的概念)
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"]
上面三个都不一样,也就说明了集合的特性。
假若你要删除全部,则可以用names = []的方式进行
var name:Set = "MJ","Sam","Minny","Austin","JE"
name = []
不过,集合这种资料储存方式,还有其他的东西可以探讨,比如像是高中数学曾经在某堂课提到的「集合运算」,也就是所谓的:交集、联集、对称差集、差集
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] //质数集合
odd_number.interaction(even_number)
//[]空集合
odd_number.symmetricDifference(prime_number)`
//[1,2,9,11]
odd_number.union(even_number)`
//1-10的集合
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.
稍微简述一下阵列、集合、元组三者的区别,可大致有下面的分类
字典最大的特徵,就是有键值对(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]
综合上述,字典的特徵就是可以用键值对操作资料。
以下再次的复习资料储存方式的特色:
铁人赛
<<: [素食吃到饱 vegetarian food] 天菜丰巢 VeGood 蔬食百汇(台中-文心秀泰)半自助晚餐 SHOWTIME LIVE TAICHUNG WENXIN STORE
>>: [Day-02] - Annotation Modulize Introduction
一、前言 所谓的团队合作,我想最重要的就是如何沟通与使用有效之协作工具!沟通属於较偏人性与软性之...
musl libc的起源为当时glibc於设计上有诸多不足之处,例如全静态连结因NSS机制而有状况、...
Salom,我是Charlie! 在Day20的时候我们完成了createOrder跟Capture...
四开四个主题实在太累,JavaScript技术手册阅读笔记这个主题就是读这本书买很久的书,顺便把之前...
阵列点灯 ( 动画 ) 教学原文参考:阵列点灯 ( 动画 ) 这篇文章延续「阵列点灯 ( 显示图形 ...