在Swift中使用Cocoa的现有设计模式介绍

使用 Cocoa 现有的一些设计模式,是帮助开发者开发一款拥有合理设计思路、稳定的性能、良好的可扩展性应用的有效方法之一。这些模式都依赖于在 Objective-C 中定义的类。因为 Swift 与 Objective-C 的互用性,所以你依然可以在 Swift 代码中使用这些设计模式。在一些情况下,你甚至可以使用 Swift 语言的特性扩展或简化这些 Cocoa 设计模式,使这些设计模式更强大、更易于使用。

委托(Delegation)

在 Swift 和 Objective-C 中,委托通常由一个定义交互方法和遵循规范的委托属性的协议表示。与 Objective-C 相比,当你在 Swift 中继承一个委托时,虽然继承模式不变,但是内部的实现已经改变了。就像在 Objective-C 中,在你向委托发送消息之前,不管它是不是 nil 你都会去查看,如果定义的方法是非必须实现的方法,不管委托有没有实现这个方法,你也都会去查看。而在 Swift 中,通过保持类型安全的特性,可以有效的消除这些繁琐、不必要的行为问题。

下面列出的代码可以说明这个过程:

1.检查 myDelegate 不为 nil。
2.检查 myDelegate 是否实现了继承的 window:willUseFullScreenContentSize: 方法。
3.如果myDelegate 不为 nil 并且实现了 window:willUseFullScreenContentSize: 方法4.那么调用该方法,将该方法的返回值分配给名为 fullScreenSize 的属性。
将该方法的返回值输出在控制台。

代码如下:

// @inteface MyObject : NSObject
// @property (nonatomic, weak) id<NSWindowDelegate> delegate;
// @end
if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) {
    println(NSStringFromSize(fullScreenSize))
}

注意: 在一个完全使用 Swift 编写的 app 中,在定义 delegate 属性时,它作为一个不定值的 NSWindowDelegate 对象,并将初始值设为 nil。

延迟初始化(Lazy Initialization)

你可以在 Lazy Stored Properties 中了解到更多关于延迟初始化的信息。

错误报告(Error Reporting)

Swift 中的错误报告模式沿用了 Objective-C 的模式,但 Swift 中不定值返回值的新特性给我们带来了额外的好处。举个很简单的例子,你用 Bool 值作为一个函数的返回值,用于标识该函数是否执行成功,当你需要输出错误信息时,你可以在函数中添加一个NSErrorPointer 类型的输出参数 NSError。这个类型类似 Objective-C 中的 NSError **,并增加了内存安全性和非强制性的传参。你可以使用 & 运算符作为前缀引用一个不定值 NSError 类型作为 NSErrorPointer 对象传递错误信息。如下面的代码所示:

代码如下:

var writeError : NSError?
let written = myString.writeToFile(path, atomically: false,
    encoding: NSUTF8StringEncoding,
    error: &writeError)
if !written {
    if let error = writeError {
        println("write failure: \(error.localizedDescription)")
    }
}

当你实现自己的方法时,你需要配置一个 NSErrorPointer 对象,并将 NSErrorPointer 对象的 memory 属性设为你创建的NSError 对象。首先检查调用者传递的参数,确保它是一个非 nil 的 NSError 对象。
复制纯文本新窗口

代码如下:

func contentsForType(typeName: String! error: NSErrorPointer) -> AnyObject! {
    if cannotProduceContentsForType(typeName) {
        if error {
            error.memory = NSError(domain: domain, code: code, userInfo: [:])
        }
        return nil
    }
    // ...
}

Target-Action模式(Target-Action)

当有特定事件发生,需要一个对象向另一个对象发送消息时,我们通常采用 Cocoa 的 Target-Action 设计模式。Swift 和 Objective-C 中的 Target-Action 模型基本类似。在 Swift 中,你可以使用 Selector 类型达到 Objective-C 中 selectors 的效果。请在Objective-C Selectors中查看在 Swift 中使用 Target-Action 设计模式的示例。

类型匹配与统一规范(Introspection)

在 Objective-C 中,你可以使用 isKindOfClass: 方法检查某个对象是否是指定类型,可以使用 conformsToProtocol: 方法检查某个对象是否遵循特定协议的规范。在 Swift 中,你可以使用 is 运算符完成上述的功能,或者也可以使用 as? 向下匹配指定类型。

你可以使用 is 运算符检查一个实例是否是指定的子类。如果该实例是指定的子类,那么 is 运算结果为 true,反之为false。

代码如下:

if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}

你也可以使用 as? 运算符尝试向下匹配子类型,as? 运算符返回不定值,结合 if-let 语句使用。

代码如下:

if let button = object as? UIButton {
    // object is successfully cast to type UIButton and bound to button
} else {
    // object could not be cast to type UIButton
}

请在 Type Casting 中查看更多信息。

检查匹配协议的语法与检查匹配类的语法是一样的,下面是使用 as? 检查匹配协议的示例:

代码如下:

if let dataSource = object as? UITableViewDataSource {
    // object conforms to UITableViewDataSource and is bound to dataSource
} else {
    // object not conform to UITableViewDataSource
}

注意,当做完匹配之后,dataSource 会转换为 UITableViewDataSource 类型,所以你只能访问和调用UITableViewDataSource 协议定义的属性和方法。当你想进行其他操作时,必须将其转换为其他的类型。

可以在 Protocols 查看更多相关信息。

(0)

相关推荐

  • Swift和C语言混合编程教程

    作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 基本数据类型 Swift 提供了一些和 C 语言的基本类型如char,int,float,double等价的 Swift 基本数据类型.然而,这些 Swift 的核心基本类型之间并不能隐式的相互转换,如 Int.因此,只有你的代码明确要求它们时再使用这些类型,而 Int 可以在任何你想使用它的时候使用. C 类型

  • 苹果公司编程语言Swift语言简介

    Swift 是一门新的编程语言,用于编写 iOS 和 OS X 应用程序.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 使用安全的编程模式并添加了很多新特性,这将使编程更简单,扩展性更强,也更有趣.Swift 支持 Cocoa 和 Cocoa Touch 框架. Swift 的开发从很久之前就开始了.为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构,让 Swift 使用自动引用计数(Automatic Reference Cou

  • 在Swift中使用Cocoa的现有设计模式介绍

    使用 Cocoa 现有的一些设计模式,是帮助开发者开发一款拥有合理设计思路.稳定的性能.良好的可扩展性应用的有效方法之一.这些模式都依赖于在 Objective-C 中定义的类.因为 Swift 与 Objective-C 的互用性,所以你依然可以在 Swift 代码中使用这些设计模式.在一些情况下,你甚至可以使用 Swift 语言的特性扩展或简化这些 Cocoa 设计模式,使这些设计模式更强大.更易于使用. 委托(Delegation) 在 Swift 和 Objective-C 中,委托通常

  • Swift中的Access Control权限控制介绍

    如果您之前没有接触过权限控制,先来听一个小故事: 小明是五道口工业学院的一个大一新生,最近他有点烦恼,因为同屋经常用他的热水壶,好像那是自己家的一样,可是碍于同学情面,又不好意思说.直到有一天,他和学姐小K吐槽. 学姐听了之后,说:大学集体生活里面,大部分东西都是默认室友可以共用的.如果你不想别人拿,我可以帮你做封印,只要打上private标记,它们就看不到你的东西,更加用不了你的东西了. 小明说哇靠学姐你还会妖法...... Swift语言从Xcode 6 beta 5版本起,加入了对权限控制

  • Swift中转义闭包示例详解

    目录 前言 转义与非转义闭包 逃离方法 将转义关闭付诸行动 注意强参考周期 内存泄漏背后的原因 消除强引用循环 概括 前言 Swift 是一种非常强大的编程语言,是为 Apple 生态系统开发应用程序的首选:iOS.macOS.watchOS 和 tvOS.作为使用 Swift 编写代码的开发人员,我们经常使用闭包:语言的一个重要而重要的章节. 闭包不是初学者开始的主题.然而,这是每个人都必须尽快了解的东西.有很多方面需要了解并了解它们的工作原理.在所有这些中,有一个特定的:转义闭包和@esca

  • Swift中的指针操作和使用详细介绍

    Apple期望在Swift中指针能够尽量减少登场几率,因此在Swift中指针被映射为了一个泛型类型,并且还比较抽象.这在一定程度上造成了在Swift中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者(包括我自己也是)来说,在Swift中使用指针确实是一个挑战.在这篇文章里,我希望能从最基本的使用开始,总结一下在Swift中使用指针的一些常见方式和场景.这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟C指针教程(或者它的中文版本),应

  • 深入理解Swift中单例模式的替换及Swift 3.0单例模式的实现

    前言 除了 MVC.MVVM 之外,单例模式可以说是 iOS 开发中另一常见的设计模式.无论是 UIKit 或是一些流行的三方库,我们都能看到单例的身影.而我们开发者本身也会潜意识地将这些类库中的代码当作最佳实践并将其带入日常工作中,哪怕很多人都知道单例存在一些明显的缺陷. 针对单例的缺陷,本文将介绍一些替换或改造单例模式的方法来提升代码质量. 单例的优点 除了上面提到的模仿最佳实践之外,单例的流行肯定也有内在的原因和理由.例如:单例对象保证了只有一个实例的存在,这样有利于我们协调系统整体的行为

  • 浅谈在Swift中关于函数指针的实现

    Swift没有什么? 苹果工程师给我建的唯一一堵墙是:在Swift中没有任何办法获得一个函数的指针: 注意,C函数指针不会导入到Swift中(来自"Using Swift with Cocoa and Objective-C") 但是我们怎么知道这种情况下钩子的地址和跳到哪呢?让我们深入了解一下,并且看看Swift的func在字节码层面上的是什么. 当你给一个函数传递一个泛型参数时,Swift并没有直接传递它的地址,而是一个指向trampoline函数(见下文)并带有一些函数元数据信息

  • swift中AnyObject和Any的介绍与区别详解

    诞生 swift 作为新起步的语言,必然抛不掉一些历史遗留包袱.用过 Objective-C 的同学肯定知道有一种叫做 id 的类型.他可以表示任意类的实例,编译器不会对其类型声明的变量进行检查.在用 swift 做 app 开发时,为了能适配 Cocoa 架构,AnyObject 就诞生了.它可以代表任意 class 类型(用来替代OC中的 id). 区别 在 Swift 中编译器会对 AnyObject 实例的方法调用做检查,还会返回一个 Optional 的结果. 原理 public ty

  • Swift中定义单例的方法实例

    什么是单例 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 单例模式(Singleton Pattern),也叫单子模式,是一种常用的软件设计模式. 在应用这个模式时,单例对象的类必须保证只有一个实例存在. 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了.这个设计模式主要目的是想在整个系统中只能出现一个类的实例.这样做当然

  • 在Swift中使用KVO的细节以及内部实现解析(推荐)

    KVO是什么? KVO 是 Objective-C 对观察者设计模式的一种实现.[另外一种是:通知机制(notification),详情参考:iOS 趣谈设计模式--通知]: KVO提供一种机制,指定一个被观察对象(例如A类),当对象某个属性(例如A中的字符串name)发生更改时,对象会获得通知,并作出相应处理:[且不需要给被观察的对象添加任何额外代码,就能使用KVO机制] 在MVC设计架构下的项目,KVO机制很适合实现mode模型和view视图之间的通讯. 例如:代码中,在模型类A创建属性数据

  • 详解js中的几种常用设计模式

    工厂模式 function createPerson(name, age){ var o = new Object(); // 创建一个对象 o.name = name; o.age = age; o.sayName = function(){ console.log(this.name) } return o; // 返回这个对象 } var person1 = createPerson('ccc', 18) var person2 = createPerson('www', 18) 工厂函数

随机推荐