小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
上一节说了Void,在其中我们提到了元组这个概念,这节我们就来简单聊一聊它。
tuple的由来
就我了解的编程语言中,Python就有元组这个概念,考虑到Swift的语法风格和Python极为相似,并且Swift是一门“借鉴”了很多编程语言特性的语言,所以说tuple(元组)这个概念完全可以看成是舶来品。
tuple的使用
我们先来看看怎么定义和表示一个元组:
let tuple: (Int, String) = (10, "season")
print(tuple)
print(tuple.0)
print(tuple.1)
给出的打印结果也非常简单:
(10, "season")
10
season
元组是需要使用()来包裹里面,这一点要记住,否则编写的时候就会报错。
表示单个元素时,我们是从角标0开始表示的,这点和数组一样。
另外,这里元组是用let修饰的,如果使用var来修饰,那么元组中对应的单个元素或者整个元组都可以重新赋值:
var tuple: (Int, String) = (10, "season")
print(tuple)
print(tuple.0)
print(tuple.1)
/// 单个元素重新赋值
tuple.0 = 20
tuple.1 = "soso"
print(tuple)
print(tuple.0)
print(tuple.1)
/// 整体重新赋值
tuple = (30, "sola")
print(tuple)
print(tuple.0)
print(tuple.1)
像这种通过角标0、1来表示元组的元素,很多时候都会不明其意,所以我们可以定义的更细致一点,比如下面这样:
var tuple: (age: Int, name: String) = (10, "season")
print(tuple.age)
print(tuple.name)
你看这样话,我们就可以明确的知道元组的第1个元素表示年龄,第2个元素表示名字了。
你甚至可以这么操作,先通过typealias定义个别名,然后在编写元组,这样就非常的简洁易懂了:
typealias PersonTuple = (age: Int, name: String)
var tuple: PersonTuple = (10, "season")
print(tuple.age)
print(tuple.name)
想想看,这和你定义一个类型,然后获取其中的值多么相似啊:
struct Person {
let age: Int
let name: String
}
let p = Person(age: 10, name: "season")
print(p.age)
print(p.name)
但是,相比较定义一个类,通过元组是不是可以更为简单的表示一个数据类型呢?
你会问,这种元组有什么用呢?
回想一个场景:当一个函数,会返回多个值的时候,一般我们怎么做的?
我们会像上面定义一个Person的类型,然后去接受值,最后返回Person。
func example(num: NSNumber, nickName: String) -> Person {
let person = Person(age: num.intValue, name: nickName)
return person
}
我们完全可以使用元组来替换掉:
func example1(num: NSNumber, nickName: String) -> (Int, String) {
return (num.intValue, nickName)
}
func example2(num: NSNumber, nickName: String) -> (age: Int, name: String) {
return (num.intValue, nickName)
}
func example3(num: NSNumber, nickName: String) -> PersonInfo {
return (num.intValue, nickName)
}
注意
需要注意的是元组不能替代你定义的数据类型,它更多是对于使用的并不是特别频繁、数据结构相对比较简单的数据进行表示。
拿捏好度,才能更好的使用与舒适的编程。
总结
本节讲解了Swift中元组的一些简单表示与用法,对比了和自定义类型返回的一些差异,说明了作为函数返回值的一些优势。
我们下期见。