使用 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与Cocoa和Objective-C交互-(3)用 Objective-C 的行为来写 Swift 类

用 Objective-C 的行为来写 Swift 类

互操作性让你能用 Objective-C 的行为定义 Swift 类。你可以在写 Swift 类的时候集成 Objective-C 类,采用 Objective-C 协议,和使用 Objective-C 其他功能的特性。这意味着在 Objective-C 熟悉的基础上用 Swift 现代化并且强大的语言特性来加强它们。

继承自 Objective-C 类

在 Swift 中,你可以定义 Objective-C 类的子类。要在 Swift 中创建 Objective-C 的子类,在 Swift 类名后面添加一个冒号(:),后面紧随着 Objective-C 类的名称。


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(2)与 Objective-C API 进行交互

与 Objective-C API 进行交互

互操作性 是在 Swift 与 Objective-C 中进行交互的一种能力,让你能够访问并且使用另一种语言编写的代码段。在你开始将 Swift 集成到你的应用开发工作流程的时候,你最好能够理解如何能够利用互操作性来重定义,改进,并且加强你写 Cocoa 应用的能力。

互操作性一个重要的方面就是它能让你在写 Swift 代码的时候使用 Objective-C API。到你导入 Objective-C API 后,你可以使用原生的 Swift 语法来初始化这些类,并和他们交互。

初始化

要在 Swift 中实例化一个 Objective-C 类,你要通过 Swift 语法来调用它的一个初始化方法。当在 Swift 中调用 Objective-C 的 init 方法时,它们使用原生的 Swift 初始化语法。”init” 方法前缀会被去掉并且成为表示这个方法是初始化方法的一个关键字。对于以”initWith” 开头的 init 方法,后面的 “With” 也会被去掉。Selector 片段中被去掉的 “init” 或 “initWith” 后面的第一个字母也是小写,并且这个 Selector 片段会被当成第一个参数的名称。 Selector 片段中的其他部分也会作为相应的参数名。每一个 Selector 片段都被包含在括号中并且在调用方法的时候都是必须的。


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(2)与 Objective-C API 进行交互

与 Objective-C API 进行交互

互操作性 是在 Swift 与 Objective-C 中进行交互的一种能力,让你能够访问并且使用另一种语言编写的代码段。在你开始将 Swift 集成到你的应用开发工作流程的时候,你最好能够理解如何能够利用互操作性来重定义,改进,并且加强你写 Cocoa 应用的能力。

互操作性一个重要的方面就是它能让你在写 Swift 代码的时候使用 Objective-C API。到你导入 Objective-C API 后,你可以使用原生的 Swift 语法来初始化这些类,并和他们交互。

初始化

要在 Swift 中实例化一个 Objective-C 类,你要通过 Swift 语法来调用它的一个初始化方法。当在 Swift 中调用 Objective-C 的 init 方法时,它们使用原生的 Swift 初始化语法。”init” 方法前缀会被去掉并且成为表示这个方法是初始化方法的一个关键字。对于以”initWith” 开头的 init 方法,后面的 “With” 也会被去掉。Selector 片段中被去掉的 “init” 或 “initWith” 后面的第一个字母也是小写,并且这个 Selector 片段会被当成第一个参数的名称。 Selector 片段中的其他部分也会作为相应的参数名。每一个 Selector 片段都被包含在括号中并且在调用方法的时候都是必须的。


继续阅读...
   发表于

使用Swift与Cocoa和Objective-C交互-(1)基本设置

基本设置

Swift 用于与 Cocoa 和 Objective-C 的无缝兼容。你可以在 Swift 中使用 Ojbective-C 的 API(从系统框架到你自己创建的代码)。这种兼容性让 Swift 成为集成到你 Cocoa 应用开发工作流中一个简单,方便并且强大的工具。

这个手册涵盖了你在开发 Cocoa 应用时的三个重要的兼容性:

  • 互操作性 让你可以在 Swift 和 Objective-C 中互相提供接口,允许你在 Objective-C 的代码中使用 Swift 的类并且在 Swift 的代码中使用 Cocoa 中的类,模式和实践。
  • 混合和匹配让你能够创建同时包含 Swift 和 Objecitve-C 文件,并且他们之间能够互相调用的项目。
  • 迁移可以通过互操作性,混合和匹配很容易的从已有的 Objective-C 代码迁移到 Swift,可以将你用 Objective-C 写的应用的某些部分使用上 Swift 的新特性。

在你开始学习这些特性之前,你需要对如何设置 Swift 环境来使用 Cocoa 系统框架有一个初步了解。


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


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