美文网首页
多元组 (Tuple)

多元组 (Tuple)

作者: wangwenju | 来源:发表于2017-06-29 22:40 被阅读0次

    多元组是我们的新朋友,多尝试使用这个新特性吧,会让生活轻松不少~

    比如交换输入,普通程序员亘古以来可能都是这么写的

    func swapMe<T>(a: inout T, b: inout T) {
        let temp = a
        a = b
        b = temp
    }
    

    但是要是使用多元组的话,我们可以不使用额外空间就完成交换,一下子就达到了文艺程序员的写法:

    func swapMe<T>(a: inout T, b: inout T) {
        (a,b) = (b,a)
    }
    

    在 Objective-C 版本的 Cocoa API 中有不少需要传递指针来获取值的地方,这一般是由于在 Objective-C 中返回值只能有一个所造成的妥协。比如 CGRect 有一个辅助方法叫做 CGRectDivide,它用来将一个 CGRect 在一定位置切分成两个区域。具体定义和用法如下:

    /*
    CGRectDivide(CGRect rect, CGRect *slice, CGRect *remainder, 
                                 CGFloat amount, CGRectEdge edge)
    */
    CGRect rect = CGRectMake(0, 0, 100, 100);
    CGRect small;
    CGRect large;
    CGRectDivide(rect, &small, &large, 20, CGRectMinXEdge);
    

    上面的代码将 {0,0,100,100} 的 rect 分割为两部分,分别是 {0,0,20,100} 的 small 和 {20,0,80,100} 的 large。由于 C 系语言的单一返回,我们不得不通过传入指针的方式让方法来填充需要的部分,可以说使用起来既不直观,又很麻烦。

    而现在在 Swift 中,这个方法摇身一变,使用了多元组的方式来同时返回被分割的部分和剩余部分:

    extension CGRect {
        //...
        func divided(atDistance: CGFloat, from fromEdge: CGRectEdge) 
                              -> (slice: CGRect, remainder: CGRect)
        //...
    }
    

    然后使用的时候,对比之前的做法,现在就非常简单并且易于理解了:

    let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
    let (small, large) = rect.divided(atDistance: 20, from: .minYEdge)
    

    相关文章

      网友评论

          本文标题:多元组 (Tuple)

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