`
cd826
  • 浏览: 129029 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Swift大开脑洞系列(一)

阅读更多

 如果我们要对一个列表进行排序时,在java中我们通常这么做:

// 我们将User按照排序号进行排序
List<User> userList = this.userService.loadAll();
Collections.sort(userList, new Comparator<User>() {
    @Override
    public int compare(User lh, User rh) {
        if (null == lh && null == rh)
            return 0;
        if (null == lh)
            return -1;
        if (null == rh)
            return 1;

        if (lh.getOrderNo() == rh.getOrderNo())
            return 0;
        return lh.getOrderNo() > rh.getOrderNo() ? 1 : -1;
    }
});

那么在Swift中怎么做呢?

Swift标准库提供了名为sort的方法,会根据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。一旦排序完成,sort(_:) 方法会返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。原数组不会被sort(_:)方法修改。

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}

var reversed = names.sort(backwards)
// reversed为["Ewa", "Daniella", "Chris", "Barry", "Alex"]

当然上面的写法是相当冗长的,好在Swift考虑了这种情形,提供了闭包使得我们可以像java中使用匿名类的方式来完成。

闭包表达式语法如下:

{ (parameters) -> returnType in 
    statements
}

闭包表达式语法可以使用常量、变量和inout类型作为参数,但不能提供默认值。也可以在参数列表的最后使用可变参数。元组也可以作为参数和返回值。

由此,我们上面的排序可以重写如下:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 
let reversed = names.sort({ (s1: String, s2: String) -> Bool in
    return s1 > s2
})

闭包的函数体部分由关键字in引入。该关键字表示闭包的参数和返回值类型都已定义,下面将是闭包函数体。

由于这个排序函数非常短,我们可以把它们写在一行中,这样代码将变成:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sort({ (s1: String, s2: String) -> Bool in return s1 > s2})

或许你已经对这个排序代码非常满意了。但是别忘了Swift的类型推断功能可不是吹的,因为排序闭包函数是作为sort(_:)方法的参数传入的,Swift是否可以为我们推断其参数和返回值的类型呢?也就是说我们是否可以将代码精简成下面所示:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sort({ s1, s2 in return s1 > s2})

我可以非常自信的告诉你这是可以的,甚至我们都把返回尖头(->)和括号都去掉了。体验到Swift的强大了吧。不过我要告诉你的是,这里我们还可以继续进行精简。在Swift中如果闭包是单行表达式,这时候可以通过省略return关键字来隐式返回结果,这样我们代码又可以精简为:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sort({ s1, s2 in s1 > s2})

嗯嗯,我知道你要说什么啦,是的Swift为内联闭包提供了参数名称缩写功能,我们可以通过$0, $1, $2的方式来顺序使用闭包的参数。也就是说我们的代码还可以继续精简为:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sort({$0 > $1})

这时候,因为全部是函数体,所以一并可以把in关键字省去。

到了这里你是不是对Swift敬仰的犹如…(此处省略若干字)

但是,我要告诉你这不是终极精简,你是否会认为我已经疯了。还好,不是我疯了,是Swift。在SwiftString类型重新定义了(重载)大于号(>)的实现,当然也定义了小于号的实现,该函数接受两个String类型的参数并返回Bool类型的值。这正好与sort(_:)方法的第二个参数需要的函数类型相符合,因此我们代码终极精简如下(如有其它更精简可以告诉我,哈哈):

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sort(>)

Ok,本次先到这里。我也是刚刚开始接触Swift,感觉非常强大和智能,入门容易,要熟悉和精通有一定难度,但开发效率比oc高。

大家可以关注我的微信公众号(CD826Workshop)来进行交流。

 

 

 

分享到:
评论

相关推荐

    swift4.0大学霸

    本教程"swift4.0大学霸"是针对Swift 4.0版本的一份详尽学习资料,旨在帮助初学者和有一定基础的开发者快速掌握这一语言。 首先,我们从Swift 4.0的关键语法特性入手。Swift 4.0引入了增强的类型推断,使得代码更加...

    swift-MRCommon一系列常用的方法工具类

    "swift-MRCommon一系列常用的方法工具类"便是这样的一个库,它集合了各种实用方法,旨在简化Swift项目的开发过程。MRCommon库提供了一系列便捷的函数和扩展,使得处理常见任务变得更加高效。 首先,MRCommon可能...

    swift-Chronology是一个为Swift构建更好日期和时间的API

    `swift-Chronology`通过引入一系列定制化的结构和协议,弥补了这些不足。 首先,`swift-Chronology`中的`Temporal`协议定义了时间值的基本行为,如获取和设置年、月、日等组件。这个协议允许任何类型遵循并实现日期...

    swift-一个强大的轮播实现

    轮播(Carousel)是一种常见的UI组件,用于展示一系列的图像或内容,如广告、产品图片或者新闻标题。通常,这些内容会按照一定的速度自动滑动,同时提供向前或向后的导航按钮供用户手动切换。 在Swift中,我们可以...

    swift-Filterpedia.swift-强大的图片滤镜库演示

    在Swift编程语言中,开发图像处理应用是一项常见的任务,尤其对于移动平台的开发者而言。`Filterpedia.swift`项目就是这样一个示例,它演示了如何利用Swift实现一个强大的图片滤镜库。这个项目不仅展示了多种图像...

    swift-Swift编写的一个Logo解释器

    Swift编程语言是由Apple公司开发的一种现代化、高性能的编程语言,被广泛用于iOS、macOS、watchOS和tvOS的应用程序开发。"Swift编写的一个Logo解释器"是一个项目,它使用Swift来实现Logo编程语言的解释器。Logo是一...

    Swift进阶 Swift4

    Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift进阶 Swift4Swift...

    The swift programming language (Swift 5.0)

    函数式编程特性也是Swift的一大亮点,如闭包(Closures)、映射(Map)、过滤(Filter)和减少(Reduce)等操作,使代码更加模块化和易于理解。Swift还支持枚举(Enums)与结构体(Structs)的关联值和原始值,提供...

    swift-一组酷炫的SwiftUI库组件和动画集合

    1. **预定义组件**:SwiftUI提供了一系列内置组件,如Button、TextField、Image、View等,它们可以快速构建基础界面。这些库可能提供了额外的自定义组件,例如高级图表、滑块、进度条等,丰富了界面元素的多样性。 ...

    Swift教程:Swift基础,第一个Swift程序

    Swift教程:Swift基础,第一个Swift程序 Swift是Apple公司推出的一种强大的编程语言,主要用于开发iOS、iPadOS、macOS、watchOS以及tvOS的应用程序。它以其简洁、安全和高性能的特点,深受开发者喜爱。本教程将带你...

    swift-swift-chess一个采用Swift2.0开发的简单棋类游戏

    Swift是苹果公司推出的一种强大的、安全的编程语言,主要用于iOS、macOS、watchOS和tvOS等平台的应用程序开发。本项目"swift-chess"是一个使用Swift 2.0版本编写的简单棋类游戏,旨在展示如何利用Swift来实现一个...

    The Swift Programming Language (Swift4)

    《Swift编程语言(Swift4版)》是Apple Inc发布的一本详细介绍Swift 4编程语言的官方指南。这本书旨在帮助开发者理解和掌握Swift这一高效且现代化的编程语言,它被广泛应用于iOS、macOS、watchOS以及tvOS等Apple平台...

    swift-一个受NSCoder启发的序列化API的一个Swift实现

    为了确保编码和解码过程不会导致意外的类型转换,项目可能会包含一系列的类型检查和错误处理机制。 6. **易于使用的API**:项目的重点可能是提供一个简洁、易用的API,使得开发者能够快速地实现对象的序列化和反...

    swift-Swift一句代码实现新特性页面

    本篇文章将聚焦于“Swift一句代码实现新特性页面”,旨在介绍如何高效地利用Swift的特性来快速构建新功能页面。 首先,我们要理解“新特性页面”通常是指应用启动时或更新后展示给用户的一系列介绍新功能或改进的...

    swift-apous-一款有趣的Swift应用-让Swift成为脚本语言

    在传统的认知中,Swift 主要被用于 iOS、macOS 和其他 Apple 平台的应用程序开发,但通过 apous,开发者可以利用 Swift 来编写命令行脚本或者进行快速的原型开发,极大地提高了开发效率。 Swift 本身具有许多优点,...

    swift-SwiftLambdaApp一个利用Swift构建AmazonLambda应用的模板

    Swift Lambda App是一个专门为开发者设计的模板,用于使用Swift编程语言构建在Amazon Web Services(AWS)上的Lambda函数。Lambda是AWS提供的一个无服务器计算服务,它允许开发者运行代码而不需预置或管理服务器。...

    swift-MacOSX屏幕保护程序能显示网页或一系列网页

    在"swift-MacOSX屏幕保护程序能显示网页或一系列网页"这个项目中,我们将会探讨如何使用Swift来构建这样一个功能丰富的屏幕保护程序。 首先,我们需要了解Mac OS X屏幕保护程序的工作原理。在Mac OS X中,屏幕保护...

    Swift4.0.3官方原版文档The Swift Programming Language(Swift4.0.3)

    Swift是一种现代、高性能的编程语言,专为编写iOS、iPadOS、macOS、watchOS和tvOS应用程序而设计。以下是基于Swift4.0.3版本的若干关键知识点: 1. **类型系统**:Swift具有强类型特性,每个变量和常量都有明确的...

    swift-swift-web一个用于处理HTMLCSS路由和中间件的Swift服务器端框架集合

    Swift-web 是一个专门为 Swift 开发者设计的服务器端框架集合,它专为处理HTML、CSS以及构建复杂的Web应用路由和中间件系统而打造。这个框架集合充分利用了Swift语言的强类型、高性能和简洁性,旨在简化后端开发过程...

Global site tag (gtag.js) - Google Analytics