swift的tuples

作者: 八条8tiao | 来源:发表于2016-07-17 16:29 被阅读116次

    Tuples的引入,实在是为我们编写程序带来极大便利。如果没有tuple,当我们在面对一些临时使用的一些自定结构时,我们不得不使用class或struct这种重量级的类型进行定义。但有了tuple,我们可以非常方便快速的将几种类型捏合成一个tuple对象,从而获得一种强大的表达能力。

    1、创建tuples

    var point = (2,2)
    

    在swift当中我们可以很容的创建tuple对象,point就是一个由两个整数构成的tuple对象,元素之间用逗号分隔(数组,字典元素之间的分隔都是如此),所有的内容用小括号括起来。当然,我们可以构造更为复杂的tuple,几乎所有swift支持的类型(包括tuple自己),都可以作为构造tuple的元素。

    var tuple = (2,false,[1,2,3],("a",1))
    

    2、访问并修改tuple元素

    我们可以用索引位置来访问tuple的元素,索引位置从0开始,逐一递增的,这是不是有点像数组?

    var point = (2,2)
    point.0 // 2 , 访问第一个元素
    point.1 // 2 , 访问第二个元素
    

    用索引位置虽然可以完成tuple的访问,当这总令人感觉有点遗憾,毕竟0,1只是个数字,除了表达位置以外无法传达更多的逻辑意义。我们本来用point定的是一个直角坐标系的一个点,我们希望用x,y这样的方式来表达才够劲吗。这时候我们可以用命名的方式定义tuple。

    var point: (x: Int,y: Int) = (2,2)
    point.x // 2 , 访问第一个元素
    point.y // 2 , 访问第二个元素
    

    当我们在创建tuple的时候,给每个位置的元素命名之后,我们就可以用元素的名称来访问该元素了,这里需要强调一下tuple的类型,tuple的类型也是有所有元素的类型共同决定的(所以swift没办法提供一个Tuple类型).

    tuple中的元素是不可以被删除的,但是可以修改,我们可以用下面的方法来修改tuple中的元素。

    var point: (x: Int,y: Int) = (2,2)
    point.x = 3  // 修改tuple的第一个元素的值为3,注意我们无法修改元素的数据类型
    

    3、tuple的一些实践

    这部分内容参考了“Tuples in Swift, Advanced Usage and Best Practices”,我这里简单列举这篇内容几个很有意思的知识点,建议大家阅读原文。

    • 在本文的开头我们说过,tuple提供我们了一种构建临时结构的灵活能力.选择struct还是tuple来进行构建取决于model是否需要持久的存在。在没有tuple的编程语言里,我们很可能是别无选择的使用一个持久性的结构来构造一个临时用的结构。
    • 如果我们用struct构建的model,需要严格控制数据的私有性,那其实完全可以考虑使用tuple进行构建,因为tuple的数据本来就私有的吗。

    • 可以把tuple作为一个固定大小的序列,比方说如果我们创建一个数据并需要保证它的长度是12,那么这不是很容易了,因为数组确实满足了一个序列的需求,但是我们如何控制别人不会多放入一个数据或者少放入一个数据呢?这里我们不如使用两个包含12个元素的tuple,编译器可以帮助我们检查其长度。

    • 可以用tuple构建复杂的可变参数,这样有点像ruby方法可以把末尾参数当做hash表,可以灵活的添加key:vale类型的参数,真可谓相当方便呀

    func varargsFunc(params: (String,Int)...) {
    
    }
    
    • tuple可以用作func/method参数,这里说的意思是函数的参数列表其实近似一个tuple,所以可以用tuple对象当做函数的参数列表进行传递.
    func somefunc(a: String,_ b: Int,_ c: Bool)
       print("Hello,world")
    }
    
    let tuple = ("hi",1,true)
    
    someFunc(tuple)
    

    相关文章

      网友评论

        本文标题:swift的tuples

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