多元组 (Tuple)

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

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

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,327评论 30 472
  • 章节导航:Swift开发指南:使用Swift与Cocoa和Objective-C(Swift 4) - 1.入门S...
    Minecode阅读 8,442评论 0 23
  • (别急,教你如何查看已经连接过的WiFi密码) (派上过用场哦) 发个简书,没网咋办╮(╯╰)╭ 呃~去邻居家蹭个...
    就这样NO阅读 1,807评论 1 5
  • 太过坚持一些东西,反而过得累,试着放下,才会过得轻松。 试着放下心中太多的要求,放下所有的执着,感觉自己如沐春风啊...
    捌柒玖零阅读 803评论 0 0
  • 1,Docker镜像 jQuery-File-Upload 组件是一个非常好用的文件上传组件,有很多友好的特性: ...
    kekefund阅读 3,826评论 0 0