当前位置: 首页 > 编程笔记 >

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

田昊天
2023-03-14
本文向大家介绍在Swift中使用Cocoa的现有设计模式介绍,包括了在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 查看更多相关信息。

 类似资料:
  • 单例模式(Singleton) 单例模式是一种常见的设计模式,在 Cocoa 开发中也经常使用。 一个简单的单例模式示例代码如下: /* Singleton.h */ #import "Foundation/Foundation.h" @interface Singleton : NSObject + (Singleton *)shardInstance; @end /* Singleton.m

  • 我们将会通过完成一个完整的应用,展示音乐专辑和专辑的相关信息来学习设计模式在 Swift 中的实现。 通过这个应用,我们会接触一些 Cocoa 中常见的设计模式: 创建型 (Creational):单例模式 (Singleton) 结构型 (Structural):MVC、装饰者模式 (Decorator)、适配器模式 (Adapter)、外观模式 (Facade) 行为型 (Behavioral

  • 我们将会通过完成一个完整的应用,展示音乐专辑和专辑的相关信息来学习设计模式在 Swift 中的实现。 通过这个应用,我们会接触一些 Cocoa 中常见的设计模式。

  • 5. 中介者(Mediator) Intent 集中相关对象之间复杂的沟通和控制方式。 Class Diagram Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。 Colleague:同事,相关对象 Implementation Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事

  • 介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 主要内容来自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript 正文 软件开发中,中介者是一个行

  • 主要内容:什么是 GOF(四人帮,全拼 Gang of Four)?,设计模式的使用,设计模式的类型,设计模式的六大原则设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码