Swift 中的利刃,函数和闭包

关于闭包的概念,相信有过其他语言开发经验的朋友都不会陌生了。简单来说闭包的语言特性,大大增加了我们的开发效率。而 Swift 更是将闭包运用的游刃有余,仿佛为它而生。下面咱们进入正题。

Swift 中闭包的概念就像是 Objective-C 中的 block闭包可以嵌套和作为参数传递。 在 Swift 中,函数也只不过是一种特殊的闭包

定义函数

Swift 中 可以使用 func 关键字来定义函数。函数可以接收并返回一个或者多个参数和元组。 返回值跟随在 -> 符号后。

1
2
3
func sayHello(firstName: String, lastName: String) -> String {
return "Hello \(lastName) \(firstName)"
}

调用函数

1
prinln(sayHello("John", "Smith")) //"Hello Smith John"

继续阅读...
   发表于

Swift Tips - 当 Swift 遇上 CocoaPods

CocoaPods 作为 iOS 开发的包管理工具,几乎成为了 Objective-C 的行业标准。它为我们提供了非常方便的包管理功能。而苹果正式发布 Swift 语言也已经有半年多时间了,Swift 作为 iOS 开发语言发布后,迅速的被开发者们所接受。而随之而来的,就是越来越多用 Swift 写出得第三方库的管理问题。而 CocoaPods 的最新预览版已经支持了 Swift 语言。这对已经开始使用 Swift 来进行开发的朋友无疑是一个很大的福音。

CocoaPods 简介

这一小节是对 CocoaPods 一个入门介绍,如果您已经了解或使用过了 CocoaPods 就可以直接掉过本小节,继续下面的内容。几乎每个相对资深的 Objective-C 开发者都会对 CocoaPods 比较熟悉。CocoaPods 是一个 iOS 和 Mac OS 平台下开发库的包管理平台。更通俗的来说,就是一个让我们不必导出去找第三方库,而是帮我们来管理这些库的更新版本的一套工具。

让我们来用一个简单的例子来说明 CocoaPods 吧:


继续阅读...
   发表于

Open Source - Nimble 库进行单元测试

Nimble 从字面上看是 敏捷,灵活 的意思。Nimble 是一个库,一个 断言库。这个库一般用于单元测试。Xcode 6 为我们集成了 XCTest 单元测试库。在正式介绍 Nimble 之前,我们有必要先介绍一下 XCTest。我们在使用 Xcode 新建项目的时候会发现它为我们创建了两个 Target,一个是我们项目的 Target 还有一个就是测试 Target

我们看到了 Xcode 为我们自动生成的 Target,我们按下 Command + U 即可运行测试项目,并且在 Xcode 的左边会显示测试结果:


继续阅读...
   发表于

Swift Tips - swift 命令行工具初探

亲爱的同学们好,今天我们要介绍这么一个东西。相信有过解释型语言(PHP,Ruby,等)使用经验的同学会更加熟悉,就是 Swift 也为我们提供了命令行运行工具,俗称 REPL。好了,我们进入正题,在安装好 Swift 开发环境的机器上,打开命令行,输入 swift 命令,就进入了 swift 命令行运行模式:

Welcome to Swift version 1.1 (swift-600.0.20.0). Type :help for assistance.
1>

现在,Swift 命令工具已经启动了。电脑前的同学们,请你们也打开自己的 Swift 命令工具,来和我一起进行下面的实验。


继续阅读...
   发表于

Swift Explore - 关于 Swift 中的 isEqual 的一点探索

在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等。比如两个字符串是否相等。而所谓的 相等 有着两层含义。一个是值相等,还有一个是引用相等。如果熟悉 Objective-C 开发的话,就会知道 Objective-C 为我们提供了一系列 isEqual: 方法来判断值相等,而 == 等于号用来判断引用相等。 我们来看一个 Objective-C 的例子就会更加明白了:

1
2
3
4
5
NSArray *arr1 = @[@"cat",@"hat",@"app"];
NSArray *arr2 = @[@"cat",@"hat",@"app"];
NSLog(@"result %i", (arr1 == arr2)); // result 0
NSLog(@"result %i", [arr1 isEqualToArray:arr2]); // result 1

上面的代码中,我们定义了两个数组,arr1arr2 这两个数组中保存的是同样的元素。接下来我们对他们进行相等比较并输出结果。第一次我们用 == 等于号进行比较,返回的结果是 0, 也就是说比较失败了。原因相信有些经验的同学都应该明白,是因为 在 Objective-C 中 == 比较的是引用,因为 arr1arr2 是两个不同的对象,所以即便他们的值相同,但他们的引用也不相同。所以 == 比较会失败。而第二个比较用得是 NSArray 的 isEqualToArray 方法,这个方法是用来进行值比较的,因为这两个数组的值相同,所以 isEqualToArray 的比较方法会返回 1。


继续阅读...
   发表于

Swift Tips - Array 类型

在开发中,数组这个概念我们应该很熟悉了,Objective-C 中为我们提供了 NSArray 作为数组的实现。大家应该对很熟悉了。而在 Swift 中,为我们提供了它自己对于数组的实现,也是这里我们要介绍的,就是 Array 类。

Array 的官方文档可以参看这里: SwiftStandardLibraryReference

废话不多说,下面就开始我们的主题啦。


继续阅读...
   发表于

Swift Tips - 在 Swift 中自定义下标访问

在 Swift 中,我们可以使用下标轻松的访问数组中的元素。比如这样:

1
2
3
var numbers:Array = [1,2,3,4,5]
println(numbers[2])
println(numbers[4])

还可以以字典的模式来进行下标访问,比如这样:

1
2
var props:Dictionary<String,String> = ["name":"Swift","speed":"fast","level":"robust"]
println(NSString(format:"%@ is a %@ and %@ language",props["name"]!,props["speed"]!,props["level"]!))

相信对编程稍微有些了解的同学,对这个特性都不会感到奇怪。所以到这里大家可能会有些疑问了,这有什么奇怪的呢,任何一门编程语言几乎都有对下标访问的支持。

没错,如果单单是下标访问的支持,确实并没有什么可说的。而 Swift 确更进了一步,问我们提供了更多的东西。

这就是, Swift 中不但提供了对数组等内置集合进行下标访问,更支持了让我们对自己的类自定义下标访问方法的特性。也就是说任何我们自己的集合类,比如数据库实体类,都可以用我们自己定义的方法来实现下标访问操作符。

继续阅读...

   发表于

使用 Swift 制作一个新闻通知中心插件(2)

我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程。我们成功的在通知中心里面显示了新闻列表。但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容。在这次的教程中,我们就以上次的教程为基础,继续将我们的通知中心插件的功能改进完善。如果您没有看过第一部分的教程,就请先参看教程的 第一部分


继续阅读...
   发表于

使用 Swift 制作一个新闻通知中心插件(1)

随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个。通知中心就不用过多介绍了,相信大家对这个都很清楚了。在以往的 iOS 版本中,我们只能使用 iOS 系统自带的有限的几个 通知中心组件。 这次新开放的这个功能,就相当于为大家提供了一个全新的市场。相信通过大家的智慧创造,一定会出现很多非常流行的应用。

其他就不多说了,现在我们来以一个新闻插件作为例子,来为大家介绍如何来创建一个 通知中心 插件。我们做好之后,大概就是这个样子:


继续阅读...
   发表于

浅谈 Swift 中的 Optionals

对于刚刚接触 Swift 的大家来说, Optionals 这个概念可能会让大家觉得有些陌生。这里就简单的和大家介绍一下 Swift 中的这个概念。

关于 nil

对于使用 Objective-C 进行过开发的朋友来说,nil 这个值并不陌生。任何 Objective-C 中的变量,都可以赋值为 nil,并且对值为 nil 的对象调用方法,不会进行任何实际的操作。

而在 Swift 中,nil 的含义和 Objective-C 中的有所不同。首先,Swift 中无论变量或是常量,都不能被赋予 nil。 它们必须有一个明确的初始值。


继续阅读...
   发表于

在 Swift 中实现单例方法

我们通常在进行开发的时候,会用到一个叫做 单例模式 的东西。相信大家也都对这种模式非常熟悉了。而且单例的使用在平时的开发中也非常频繁。 比如我们常用到的 NSUserDefaults.standardUserDefaults()

在 Swift 中我们如何实现单例模式呢?如果你曾经对 Objective-C 比较熟悉的话,你可能首先会想到这样写:

1
2
3
4
5
6
7
8
9
10
11
12
class DBManager {
class var instance: DBManager?
class func sharedInstance() -> DBManager {
if !instance {
instance = DBManager()
}
return instance!
}
}

继续阅读...
   发表于

在 App 扩展和主 App 间共享数据

随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了。这为开发者们又带来了很多机会。

而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题。就是由于 App Store 的规则是 App Extension 不能独立的发布,而是要跟随一个宿主应用一起发布。

比如奇妙清单:


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(8)将你的 Objective-C 代码迁移到 Swift 中

将你的 Objective-C 代码迁移到 Swift 中

迁移 提供了通过替换 Swift 代码,修正你的 Objective-C 应用并改进它的架构,逻辑和性能的机会。为了更加直观,
对 app 的增量迁移,你需要使用前面学到的工具 - 混合和匹配加上互操作性。混合和匹配能够更容易的选择在 Swift 中要实现
哪些特性和功能,并且在 Objective-C 中留下哪些功能。互操作性,让这些特性回到 Objective-C 实现更加无障碍。
使用这些工具来探索 Swift 的扩展功能并将他们集成回 Objective-C 应用中,并且不需要对 Swift app 进行任何更改。


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(6)与 C API 交互

与 C API 交互

作为与 Objective-C 互操作性的一部分,Swift 维护了与一定数量的 C 语言类型和特性的兼容性。Swift 还提供了与 C 构造器和设计模式交互的方式。

原始类型

Swift 提供了和 C 原生整型的等值-例如,charintfloatdouble。然而,没有在这些类型和 Swift 整型类型之间的隐式转换,比如 Int。因此,如果你的代码实在需要它们,才使用这些类型,否则在任何可能的情况下,都使用 Int


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(5)采用 Cocoa 的设计模式

采用 Cocoa 的设计模式

使用 Cocoa 已有的设计模式,可以帮助你建立良好设计,并且有弹性的 App。许多这些模式都依赖于定义在 Objective-C 中的类。因为 Swift 和 Objective-C 之间的互操作性,你可以在 Swift 中利用这些公用的模式。在很多案例中,你可以使用 Swift 的语言特性来扩展或简化现有的 Cocoa 设计模式,让他们更加强大并易于使用。

代理

在 Swift 和 Objective-C 中,代理通常都以协议的方式来表示。和 Objective-C 比起来,当你在 Swift 中实现代理时,设计模式还是相同的,但是实现方式改变了。就像 Objective-C,在你发消息给代理之前,你回检测它是否为 nil —— 还有这个方法是否为 Optional 的,你检查这个代理是否响应这个 selector。在 Swift 中,可以通过维护类型安全来解决这个问题。下面列出的代码描述了如下的过程:

  1. 检测 myDelegate 为非 nil。
  2. 检测 myDelegate 是否实现了 window:willUseFullScreenContentSize:
  3. 如果 1 和 2 的条件满足,那么调用这个方法并将返回值赋给 fullScreenSize 变量。
  4. 打印方法的返回值。

继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(5)采用 Cocoa 的设计模式

采用 Cocoa 的设计模式

使用 Cocoa 已有的设计模式,可以帮助你建立良好设计,并且有弹性的 App。许多这些模式都依赖于定义在 Objective-C 中的类。因为 Swift 和 Objective-C 之间的互操作性,你可以在 Swift 中利用这些公用的模式。在很多案例中,你可以使用 Swift 的语言特性来扩展或简化现有的 Cocoa 设计模式,让他们更加强大并易于使用。

代理

在 Swift 和 Objective-C 中,代理通常都以协议的方式来表示。和 Objective-C 比起来,当你在 Swift 中实现代理时,设计模式还是相同的,但是实现方式改变了。就像 Objective-C,在你发消息给代理之前,你回检测它是否为 nil —— 还有这个方法是否为 Optional 的,你检查这个代理是否响应这个 selector。在 Swift 中,可以通过维护类型安全来解决这个问题。下面列出的代码描述了如下的过程:

  1. 检测 myDelegate 为非 nil。
  2. 检测 myDelegate 是否实现了 window:willUseFullScreenContentSize:
  3. 如果 1 和 2 的条件满足,那么调用这个方法并将返回值赋给 fullScreenSize 变量。
  4. 打印方法的返回值。

继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(4)使用 Cocoa 数据类型

使用 Cocoa 数据类型

作为 Objective-C 互操作性的一部分,Swift 提供了方便和高效的方式来处理 Cocoa 数据类型。

Swift 自动将 Objective-C 类型转换成 Swift 类型,并且将一些 Swift 类型转换成 Objective-C 类型。还有很多数据类型在 Swift 和 Objective-C 中是可以通用的。这些可转换或者可通用的数据类型被叫做 bridged 数据类型。例如,在 Swift 代码中,你可以将 Array 类型的值传递给接受 NSArray 类型对象的方法。当你使用 as 来转换这些类型 - 或明确的提供常量或变量的类型 - Swift 会桥接数据类型。

Swift 还提供对 Foundation 数据类型方便的接口,让你与其他 Swift 代码语言感觉自然和统一的方式来使用它们。


继续阅读...
   发表于
微信公众平台
更多精彩内容,请关注微信公众号


公众号:swift-cafe
邮件订阅
请输入您的邮箱,我们会把最新的内容推送给您: