元祖

作者: 曹来东 | 来源:发表于2018-09-20 16:42 被阅读11次

元组是Swift编程语言中唯一的一种复合类型。它可以将指定有限个数的任何类型依次整理为一个对象。一个元组类型的形式为:(type1, type2, type3, ... , typen)。元组中的每一种类型都可以是任意的结构体、枚举或类类型,甚至也可以是一个元组以及空元组。元组中的每个元素我们也称之为一个分量(component)。

enum MyEnum {
case one, two, three
}
 
class MyClass {
var member = 0
}
 
// 声明一个元组常量tuple,其类型为:
// (Int, MyEnum, MyClass)
let tuple: (Int, MyEnum, MyClass) = (10, .one, MyClass())
// 声明了元组常量tuple2,其类型为:
// (Int, (Int, Double, Bool), Int)
// 其第二个元素也是一个元组
let tuple2 = (10, (20, 0.5, true), 0)

如果一个圆括号中没有任何元素,那么我们把它称作为一个空元组.

元组比较

  • 两个相同元素类型的元组,如果每个元素都遵循了 Equatable协议,那么这两个元组对象可以用 == 操作符以及 != 操作符来判别两者是否相等。如果两个元组对象中的每个元素的值都相等,那么这两个元组对象是相等的,否则它们是不等的。
  • 两个相同元素类型的元组,如果每个元素都遵循了 Comparable 协议,那么这两个元组可以用 > 操作符、< 操作符、 >= 操作符以及 <= 操作符来比较大小。在比较两个元组的时候,从这两个元组的第一个元素开始进行比较,如果能比较出结果,那么就立即返回比较结果,否则再依次比较下去。
let t1 = (1, 2, 3)
let t2 = (1, 2, 3)
 
// 判断元组t1与t2是否相等,
// 结果为true
print("t1 == t2? \(t1 == t2)")
 
let t3 = (2, 3, 4, 5)
let t4 = (2, 1, 7, 9)
// 这里比较元组t3与t4是否为小于关系,
// 结果为false,
// 因为t3的第2个元素大于t4的第2个元素
print("t3 < t4? \(t3 < t4)")
 
// 这个比较将直接编译报错,
// 因为这两个不是相同类型的元组
var b = t1 < t3
 
// 这句也会引发编译报错,
// 因为布尔类型不遵循Comparable协议,
// 所以不能进行比较,
// 尽管这里的Int与Double可进行比较
b = (true, 1, 2.0) > (false, 2, -1.0)

空元组

所谓空元组就是一个不包含任何元素的元组,即 ()Swift编程语言中对空元组有一个非常特殊的定义——既可以将它用来作为对象或函数的类型进行声明,也可以将它作为右值。

  • 当作为对象或函数的类型声明时,它表示无,即相当于C语言中的 void 。
  • 当作为类型使用时,我们往往使用 Void 来显式标出。在Swift编程语言中,Void其实就是用空元组来定义的。
  • 当空元组作为右值时,它表示一个空表达式,并且类型为 Void
    注意的是,如果空元组作为右值使用,那么就不能写 Void,而必须直接用()。因为 Void是以类型的方式定义的,而不是以值的方式
    空表达式(即void 表达式)与空值表达式(nil 表达式)是有本质区别的。前者表示不具有任何类型,除了通配符(_)以及表示 Void 的对象之外,不能赋值给其它任何类型的对象。而空值nil 则可赋值给任一Optional对象,表示其当前引用为空。
// 声明一个Void类型的常量v
let v: Void
 
// 用空元组对v初始化
v = ()
 
// 将v赋值给缺省对象说明符,
// 这条语句是一条空语句,
// 编译器会直接将它忽略
_ = v
 
var a = 10
 
// 这里需要对result显式标明Void类型,
// 否则会有编译警告+=操作符返回值为void
//所以result为void 空元祖
let result: Void = a += 100
 
// 空元组值也可以被打印出来,
// 输出:result = (), a = 110
print("result = \(result), a = \(a)")
 
// 这里先提前说明一下,
// 空元组也能赋值给Any类型的对象
let obj: Any = result
 
// 我们甚至还可以用is来判断Void对象的类型
let isVoid = obj is Void
 
// 输出:isVoid? true
print("isVoid? \(isVoid)")
 

可以看到,在Swift中可以将对象显式声明为Void 类型,这一点比起其他类C语言都要灵活。这看似没什么实际作用,但却给Swift语法体系带来了完备性.

  • () 中如果包含了2个或更多个类型,那么它就是一个元组,所以在数学上我们可以将元组看作为一个向量类型;而如果在 ()中只包含一个类型,那么它就是一个普通的标量类型;而如果在 ()中什么都没有呢?那么它就是“虚无”的存在。只不过“虚无”在Swift编程语言中可以以一种特殊的对象身份出现(Void)。不管怎么说,“真空”也算是一个“对象”.
  • 空元组也能作为一个元组的元素。这种语义扩展不仅是对整个类型系统完备性的增强,而且确实会有其用武之地.
var loop = 3
 
repeat {
print("Hello, world!")
} while (loop -= 1, loop).1 > 0
 
// 这条if语句已经显示出了警告:
// 'is'测试总是为真
// -= 返回值为Void类型
if (loop -= 1, loop).0 is Void {
print("Yes, it's void!")
}

上述代码执行后将会打印三行“Hello, world!”以及最后一句“Yes, it’s void!”.可以体会一下元组字面量的强大魔力以及Swift强大的表现力。
这样就引入了对于元组字面量的表达式求值顺序问题。在Swift编程语言中,对元组各个元素的计算是有先后次序的,也就是说每个元素之间都会有一个顺序点(Sequence Point)。元组字面量的计算顺序为从左到右,即从第一个元素到最后一个元素。当第一个元素表达式计算完成之后,才会计算第二个元素表达式。我们可以看以下代码例子:

var loop = 2
_ = (loop -= 1, loop *= 2)
// 这里loop的值为2,
// 说明先执行了loop -= 1,
// 再执行loop *= 2
print("loop = \(loop)")

相关文章

  • 2020-09-28-元祖和字典

    day6-元祖和字典 元祖 什么是元祖(tuple)元祖是不可变的列表元祖是容器型数据类型,将()作为容器标志,里...

  • Day6-7字典,元祖,集合

    元祖 1.什么是元祖元祖就是不可变的列表,列表中除了可变的操作以外,其他的操作都适用于元祖元祖值: a.使用()将...

  • day6总结

    一、元祖 1.什么是元祖元祖就是不可变的列表,列表中除了可变的操作其他的操作都适用于元祖元祖值:a.使用()将元素...

  • Swift 元祖

    元祖的简单介绍 元祖是一种数据结构,在数学中广泛使用 元祖类似于数组和字典 元祖可以用于定义一组数据 组成元祖类型...

  • 2019-04-24总结

    1.元祖 1.什么是元祖(tuple)元祖是python提供的容器型数据类型(序列),不可变,有序元祖就是不可变的...

  • ReactiveCocoa入门(2)元祖、json解析、应用

    3.3 元祖 RACTuple 什么叫做元祖?在 swift 中也有所谓的元祖,但是他跟 Objective-C ...

  • Python元祖

    元祖 1.什么是元祖? 元祖就是一个使用()圆括号括起来的数据集合类型,里面可以容纳列表类型。 2.如何创建元祖?...

  • 【Python基础】9. 元祖 (tuple)

    目录:元祖的基本概念创建元祖将列表转化为元组查询元组更新元组删除元组 1. 元祖的基本概念 元祖可以理解为,不可变...

  • Python collections模块--nametuple

    nametuple 可命名元祖 nametuple 为元祖中每个位置分配含义,可以在使用常规元祖的地方使用,并且添...

  • 元祖 (tuple)

    1.什么是元祖? (1)元祖就是不可变的列表,列表中除了可变的操作以外,其他操作都适用于元祖当元祖的元素只有一个时...

网友评论

      本文标题:元祖

      本文链接:https://www.haomeiwen.com/subject/avennftx.html