元祖类型
元组是什么鬼:
一开始我是拒绝的,因为我是个菜狗,我根本不知道元组是什么意思,简直太专业了、太吓人了。 :huaji11:
等我学完之后才发现,原来就是一种数据封装形式而已。
如果数据封装体,数据组合体,或者叫什么元素组合都容易理解,非得叫它元组。 :huaji12:
不清楚哪位dalao翻译的这么专业,用一个专业名词解释另外一个专业名词,对我这种菜狗,莫得文化的人来说,十分不友好呐,就不能翻译的更加土味一点吗 :huaji2: 更加接地气一点吗 :huaji:
元组定义:
元组就是将一些各种花里胡哨不同类型或者相同类型的数据封装起来,就是用括号括起来,里面的数据用逗号隔开,[heimu]防止挨着太近容易怀上,[/heimu]这样就组成了元组类型
定义好的变量元组,可以取数据,可以修改数据,但是不能新增加数据和删除数据
定义好的常量元组,可以取数据,不能修改数据,也不能新增加数据和删除数据
请看下面代码,直接复制粘贴在Xcode里创建playground文件开始测试,常量也行,变量也行,注意下面的拼接字符串语法,不要搞晕了。 :huaji13:
var a = (1,25.5,"hello","s",true) //刚开始先用最简单的数据类型,等后面学了其他数据类型,也可以放里面
var b = (3,70.8,"world","r",false)
print("隐藏数据类型-定义元组类型数据a:\(a)")
print("隐藏数据类型-定义元组类型数据b:\(b)")
var c:(Int,String) = (5,"swift")
var d:(Bool,Double) = (false,12.88)
print("显示数据类型-定义元组类型数据c:\(c)")
print("显示数据类型-定义元组类型数据d:\(d)")
/*
*编译器打印结果:
隐藏数据类型-定义元组类型数据a:(1, 25.5, "hello", "s", true)
隐藏数据类型-定义元组类型数据b:(3, 70.8, "world", "r", false)
显示数据类型-定义元组类型数据c:(5, "swift")
显示数据类型-定义元组类型数据d:(false, 12.88)
*/
空元组的定义:
var e = ()//这是一个没有任何数据的元组,人类称呼它为空元组
print("空元组定义-定义元组类型数据e:\(e)")
/*
*编译器打印结果:
*/
//自然是没有啦 不然你以为是什么_(:з」∠)_
有的人就开始搞事情了我要是只有写怎么样呐
var f:(Int,String) = ()
不能这样写,前面指定元组里面的数据类型,那么元组里必须有相对应的数据 :huaji23:
获取元组中的数据:通过索引方法,0位索引起始位置,这跟其他编程语言都一样
var value = ("hello",5,false)
//下面通过索引获取元组中的相应数据
print(value.0)
print(value.1)
print(value.2)
/*
*编译器打印结果:
hello
5
false
*/
修改元组中的数据:需要注意的是,如果value是个常量那么就不能修改元组里面的值
var value = ("hello",5,false)
print("修改前:\(value)")
//通过索引修改该索引的值
value.0 = "world"
print("修改后:\(value)")
/*
*编译器打印结果:
修改前:("hello", 5, false)
修改后:("world", 5, false)
*/
元组的传递:一个元组类型的变量可以赋值给另一个元组类型的变量
var a = ("hello",false)
var b = a
print("当前a的数据:\(a)")
print("a赋值给b的数据:\(b)")
print("---------------")
var c:(String,Bool) = ("world",true)
print("当前c的数据:\(c)")
c = a
print("a赋值给c后的数据:\(c)")
/*
*编译器打印结果:
当前a的数据:("hello", false)
a赋值给b的数据:("hello", false)
---------------
当前c的数据:("world", true)
a赋值给c后的数据:("hello", false)
*/
通过名称获取元组中的数据:
通过索引获取元组里的数据,这种方式确实很方便,但是对于我这种智商不是很高,100以内加减法都容易算错的人来说,索引一旦写多了,容易晕头转向。 :huaji9:
那么苹果针对我这种情况,设计了一种方式,定义元组的时候可以给元组中的数据起个可爱一点的名字,这样可以通过名字获取元组中的数据。 :huaji13:
比如下面的定义方式,你可以绞尽脑汁,搜肠刮肚,给元组中的元素定义几个非常洋气的英文名字 :huaji:
var data = (f:"hello",u:"world",c:10,k:true)
print("获取data叫f的值:\(data.f)")
print("获取data叫u的值:\(data.u)")
print("获取data叫c的值:\(data.c)")
print("获取data叫k的值:\(data.k)")
/*
*编译器打印结果:
获取data叫f的值:hello
获取data叫u的值:world
获取data叫c的值:10
获取data叫k的值:true
*/
变量声明的时候也可以先定义好元组数据名称
已下面例子,结果都一样
var parm1:(name1:String,name2:Double) = ("hello",10.5)
var parm2:(name1:String,name2:Double) = (name1:"hello",name2:10.5)
print("获取parm1的数据\(parm1)")
print("获取parm2的数据\(parm2)")
/*
*编译器打印结果:
获取parm1的数据(name1: "hello", name2: 10.5)
获取parm2的数据(name1: "hello", name2: 10.5)
*/
将元组拆分,赋值给常量或变量,甚至可以拆分时用下划线设置省略值
let (name1,name2) = ("swift",10.5)
print("常量name1的值:\(name1)")
print("常量name2的值:\(name2)")
print("---------")
var (name3,name4) = ("apple",true)
print("常量name3的值:\(name3)")
print("常量name4的值:\(name4)")
print("---------")
let (name5,_,name6) = (255,114514,true)//用_下划线表示省略该值
print("常量name5的值:\(name5)")
print("常量name6的值:\(name6)")
/*
*编译器打印结果:
常量name1的值:swift
常量name2的值:10.5
---------
常量name3的值:apple
常量name4的值:true
---------
常量name5的值:255
常量name6的值:world
*/
元组也是值类型的一种,传递时会拷贝一份给数据接收端,而不是传地址
如下方例子,将元组a赋值给元组b,那么元组b修改元组中的第一个数据,并不会影响到元组a中的第一个数据
var a = (name1:"hello",name2:true)
var b = a
print(a)
print(b)
print("-------------")
b.name1 = "world"
print(a)
print(b)
/*
*编译器打印结果:
(name1: "hello", name2: true)
(name1: "hello", name2: true)
-------------
(name1: "hello", name2: true)
(name1: "world", name2: true)
*/
提前说个问题
元组作为一种数据封装形式,而且简单好用,那么当然可以当作函数的参数传递了,也可以当作函数的返回值
在其他有面向对象的编程语言中,比如Java、Object-C、C#中,函数并没有多返回值的形式,如果想返回多个值,那么可以用集合,数组,甚至封装成类进行返回,代价比较大,而且有时完全没有必要。 :huaji5: [heimu](具体看编程人员的写法,毕竟一个功能大家都有自己的写法思路,不一定非要学习一种固定写法,主要看你的思路扩展)[/heimu]
那么元组可以很好的解决此类问题,比如有一堆临时数据,可以封装到元组中,传到行数里进行处理,最后再将元组返回。
比如下面的例子,还没介绍到函数,不过只要学过编程应该都能够看懂,后面的教程会详细介绍函数,这里只是提前介绍一下[heimu](没错,提前给在看文章的你介绍了解你Swift“老婆/老公”部分能力的用法)[/heimu] :huaji4:
定义一个函数,参数是元组类型,返回值也是元组类型,函数里面对传进来的元组数据进行处理,然后再返回处理好的元组
var data = (name:"YoMi",age:8,superpowers:true,motto:"知识就是力量!(吃我新华字典!)")
func handle(parm:(String,Int,Bool,String)) ->(String,Int,Bool,String){
var data_temp = parm
data_temp.0 = "摸鱼"
data_temp.1 = 999
data_temp.2 = false
data_temp.3 = data_temp.0 + "天天吃鸡吃不胖,天天摸鱼身体棒"
return data_temp
}
print("获取data的数据:\(data)")
print("---------------------")
let dataUpdateAfter = handle(parm: data)
print("获取使用传参修改后data的数据:\(dataUpdateAfter)")
/*
*编译器打印结果:
获取data的数据:(name: "YoMi", age: 8, superpowers: true, motto: "知识就是力量!(吃我新华字典!)")
---------------------
获取使用传参修改后data的数据:("摸鱼", 999, false, "摸鱼天天吃鸡吃不胖,天天摸鱼身体棒")
*/
关于元组和其他操作等后面的章节再解释,前期学习Swift知识比较杂乱,先把基础掌握了
Comments NOTHING