Swift互用性: 使用Objective-C特性编写Swift类(Swift 2.0版)-b

本节包括内容:

  • 继承Objective-C的类(Inheriting from Objective-C Classes)
  • 采用协议(Adopting Protocols)
  • 编写构造器和析构器(Writing Initializers and Deinitializers)
  • 集成Interface Builder(Integrating with Interface Builder)
  • 指明属性特性(Specifying Property Attributes)
  • 实现Core Data Managed Object子类(Implementing Core Data Managed Object Subclasses)
  • 使用带Objective-C API的Swift类名

互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类。编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objective-C 的协议,还可以利用 Objective-C 的一些其它功能。这意味着,开发者可以基于 Objective-C 中已有的熟悉、可靠的类、方法和框架来创建 Swift 类,并结合 Swift 提供的现代化和更有效的语言特点对其进行优化。

继承Objective-C的类

在 Swift 中,开发者可以定义一个子类,该子类继承自使用 Objective-C 编写的类。创建该子类的方法是,在 Swift 的类名后面加上一个冒号(:),冒号后面跟上 Objective-C 的类名。

import UIKit
class MySwiftViewController: UIViewController {
    // 定义类
}

开发者能够从 Objective-C 的父类中继承所有的功能。如果开发者要覆盖父类中的方法,不要忘记使用override关键字。

NSCoding协议

NSCoding协议要求符合的类型实现所需的构造器init(coder:)。直接采用NSCoding协议的类必须实现这个方法。采用NSCoding协议的类的子类,这些类有一个或者多个自定义的构造器或者不带初始化值的属性,也必须实现这个方法。Xcode提供了以下占位实现来提醒:

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

对那些从 Storyboards 里加载的对象,或者用 NSUserDefaults 或 NSKeyedArchiver 类归档到磁盘的对象,你必须提供一个完整的初始化程序的实现。然而,当类型以此种方式无法实例化的时候,你可能并不需要实现构造器。

采用协议

在 Swift 中,开发者可以采用 Objective-C 中定义好的协议。和 Swift 协议一样,所有 Objective-C 协议都写在一个用逗号隔开的列表中,跟在所在类的父类名后面(如果它有父类的话)。

class MySwiftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    // 定义类
}

Objective-C 协议与 Swift 协议使用上是一致的。如果开发者想在 Swift 代码中引用 UITableViewDelegate协议,可以直接使用UITableViewDelegate(跟在 Objective-C 中引用id是等价的)。

因为在 Swift 中,类和协议的命名空间是统一的,Objective-C 里的 NSObject 协议被重新映射到 Swift 里的 NSObjectProtocol。

编写构造器和析构器

Swift 的编译器确保在初始化时,构造器不允许类里有任何未初始化的属性,这样做能够增加代码的安全性和可预测性。另外,与 Objective-C 语言不同,Swift 不提供单独的内存分配方法供开发者调用。当你使用原生的 Swift 初始化方法时(即使是和 Objective-C 类协作),Swift 会将 Objective-C 的初始化方法转换为 Swift 的初始化方法。关于如何实现开发者自定义构造器的更多信息,请查看构造器

当开发者希望在类被释放前,执行额外的清理工作时,需要执行一个析构过程来代替dealloc方法。在实例被释放前,Swift 会自动调用析构器来执行析构过程。Swift 调用完子类的析构器后,会自动调用父类的析构器。当开发者使用 Objective-C 类或者是继承自 Objective-C 类的 Swift 类时,Swift 也会自动为开发者调用这个类的父类里的dealloc方法。关于如何实现开发者自定义析构器的更多信息,请查看[析构器]。

集成Interface Builder

Swift 编译器包含一些属性,使得开发者的 Swift 类集成了 Interface Builder 里的一些特色功能。和 Objective-C 里一样,你能在 Swift 里面使用 outlets,actions 和实时渲染(live rendering)。

使用Outlets和Action

使用 Outlets 和 Action 可以连接源代码和 Interface Builder 的 UI 对象。在Swift里面使用 Outlets 和 Action,需要在属性和方法声明前插入@IBOutlet或者@IBAction关键字。声明一个 Outlet 集合同样是用@IBOutlet属性,即为类型指定一个数组。

当开发者在 Swift 里面声明了一个 Outlet 时,Swift 编译器会自动将该类型转换为弱(weak)、隐式(implicitly)、未包装(unwrapped)的 optional(Objective-C 里面对应指针类型)数据类型,并为它分配一个初始化的空值nil。实际上,编译器使用@IBOutlet weak var name: Type! = nil来代替 @IBOutlet var name: Type。编译器将该类型转换成了弱(weak)、隐式(implicitly)、未包装(unwrapped)的 optional 类型,因此开发者就不需要在构造器中为该类型分配一个初始值了。当开发者从故事板(storyboard)或者xib文件里面初始化对象 class 后,定义好的 Outlet 和这些对象连接在一起了,所以,这些 Outlet 是隐式的,未包装的。由于创建的 outlets 一般都是弱关系,因此默认 outlets 是弱类型。

例如,下面的 Swift 代码声明了一个拥有 Outlet、Outlet 集合和 Action 的类:

class MyViewController: UIViewController {
    @IBOutlet var button: UIButton
    @IBOutlet var textFields: UITextField[]
    @IBAction func buttonTapped(AnyObject) {
        println("button tapped!")
    }
}

在buttonTapped方法中,消息发送者的信息没有被使用,因此可以省略该方法的参数名。

实时渲染(live rendering)

开发者可以在 Interface Builder 中用@IBDesignable和@IBInspectable来创建生动、可交互的自定义视图(view)。开发者继承UIView或者NSView来自定义一个视图(view)时,可以在类声明前添加@IBDesignable属性。当你在 Interface Builder 里添加了自定义的视图后(在监视器面板的自定义视图类中进行设置),Interface Builder 将在画布上渲染你自定义的视图。

注意:只能针对框架里对象进行实时渲染

你也可以将@IBInspectable属性添加到和用户定义的运行时属性兼容的类型属性里。这样,当开发者将自定义的视图添加到 Interface Builder 里后,就可以在监视器面板中编辑这些属性。

@IBDesignable
class MyCustomView: UIView {
    @IBInspectable var textColor: UIColor
    @IBInspectable var iconHeight: CGFloat
    /* ... */
}

指明属性特性

在 Objective-C 中,属性通常都有一组特性(Attributes)说明来指明该属性的一些附加信息。在 Swift 中,开发者可以通过不同的方法来指明属性的这些特性。

强类型和弱类型

Swift 里属性默认都是强类型的。使用weak关键字修饰一个属性,能指明其对象存储时是一个弱引用。该关键字仅能修饰 optional 对象类型。更多的信息,请查阅特性

读/写和只读

在 Swift 中,没有readwrite和readonly特性。当声明一个存储型属性时,使用let修饰其为只读;使用var修饰其为可读/写。当声明一个计算型属性时,为其提供一个 getter 方法,使其成为只读的;提供 getter 方法和 setter 方法,使其成为可读/写的。更多信息,请查阅属性

拷贝

在 Swift 中,Objective-C 的copy特性被转换为@NSCopying属性。这一类的属性必须遵守 NSCopying协议。更多信息,请查阅特性

实现Core Data Managed Object子类

Core Data 提供了基本存储和实现NSManagedObject子类的一组属性。在与Core Data 模型中管理对象子类相关的特性或者关系的每个属性定义之前,将@NSmanaged特性加入。与 Objective-C 里面的 @dynamic特性类似,@NSManaged特性告知 Swift 编译器,这个属性的存储和实现将在运行时完成。但是,与@dynamic不同的是,@NSManaged特性仅在 Core Data 支持中可用。

Swift 类被命名空间化---他们局限于被编译的模块中(最典型的是Target)。 为了使用带 Core Data 模型的NSManagedObject类的 Swift 子类,在模型实体监视器的类区域里,用模块名字作为类名的前缀。

使用带Objective-C API的Swift类名

Swift 类的命名基于他们被编译的模块,即使是使用来自 Objective-C 的代码。和 Objective-C 不同的是,所有的类都是全局命名空间的一部分,必须没有相同的名字,Swift 类可以基于他们存在的模块来消除歧义。比如,被称为 MyFramework 框架中的被叫做DataManager 的 Swift 类的全限定名就是 MyFramework.DataManager。一个 Swift 应用目标就是模块本身,所以,在一个叫 MyGreatApp 的应用里,叫 Observer 的 Swift 类的全限定名是 MyGreatApp.Observer。

为了保存在 Objective-C 代码里使用的 Swift 类,Swift类用他们的全限定名暴漏给 Objective-C 运行时。因此,当你使用那些对 Swift 类的字符串代表起作用的 API,必须包含类的全限定名。比如,当你创建一个基于文档的 Mac 应用,要在应用的 Info.plist 里提供 NSDocument 子类的名字。Swift里,你必须使用文档子类的全名,包括从你的应用或者框架里派生出来的模块名字。 下面的例子中,NSClassFromString方法用于检索一个来自字符串代表的类的引用。为了检索 Swift 类,需要使用全限定名,包括应用的名字。

let myPersonClass:AnyClass(NSClassFromString("MyGreatApp.Person"))
时间: 2025-01-12 14:16:46

Swift互用性: 使用Objective-C特性编写Swift类(Swift 2.0版)-b的相关文章

Swift互用性:与 Objective-C 的 API 交互(Swift 2.0版更新)-备

本页包含内容: 初始化 可失败初始化 访问属性 方法 id 兼容性(id Compatibility) 空值和可选值 扩展(Extensions) 闭包(Closures) 比较对象 Swift 类型兼容性 动态分发 轻量级泛型 Objective-C 选择器(Selectors) 互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 C

Swift互用性:与 Cocoa 数据类型共舞(Swift 2.0版)-b

本节内容包括: 字符串(Strings) 数值(Numbers) 集合类(Collection Classes) 错误(Errors) Foundation数据类型(Foundation Data Types) Foundation函数(Foundation Functions) Core Foundation 作为对 Objective-C 互用性(互操作性)的一部分,Swift提供快捷高效的方式来处理 Cocoa 数据类型. Swift 会自动将一些 Objective-C 类型转换为 Sw

Swift互用性:与 C的API交互(Swift 2.0版)-b

节包含内容: 基本数据类型(Primitive Types) 枚举(Enumerations) 指针(Pointer) 全局常量(Global Constants) 预处理指令(Preprocessor Directives) 作为与Objective-C语言的互用性的一部分,Swift也对一些C语言的类型和特性保持了兼容性.如果你的代码有需要,Swift也提供了一些方式来使用常见的C结构和模式. 基本数据类型 Swift提供了一些与C语言基本类型如char,int,float和double等的

swift初探(供objective c开发者参考)

6月初的wwdc苹果推出了一门新的开发语言swift.系统10.9.3以上安装xcode6 beta版即可体验swift. 苹果公司做了尽可能多的努力让这门语言迅速成为一个工业级的实用编程语言,而不是华而不实的花瓶. 通过xcode6查看文档,可以发现之前现存的接口都多了swift适配,举例如下(以下都从苹果官方文档中摘录): 简单方法适配: swift: func UIImageJPEGRepresentation(_ image: UIImage!, _ compressionQuality

Swift 3 中的新特性

原文:What's New in Swift 3? 作者:Ben Morrow 译者:kmyhy Swift 3 将在下半年退出,对于 Swift 程序员来说,它带来了许多改变. 如果你没有密切关注 Swift Evolution 项目,那么在将代码迁移到 Swift 3 时,你可能不知道它到底有什么改变,以及它会对你的代码带来什么影响.那么你可能需要读一下这篇文章了. 通过本文,我将重点介绍 Swift 3 中的重大改变,这些改变对你的代码有深刻影响.让我们开始吧! 开始 目前,Swift 3

使用Playground编写第一个Swift程序

从控制台输出"HelloWorld"是我学习C语言的第一步,也是我人生中非常重要的一步.多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇.瑰丽的世界--Swift编程. 本章以HelloWorld作为切入点,向大家系统介绍如何使用Xcode的Playground编写和运行Swift程序代码. 编写和运行Swift程序有多种方式,我们可以通过在Xcode中创建一个iOS或Mac OS X工程来实现,也可以通过使用Xcode6提供的Playground来实现.

iOS开发——新特性OC篇&Objective新特性

Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时,也有很多像我一样工作上依然需要坚守着 Objective-C 语言的开发者们.今年的 WWDC 中介绍了几个 Objective-C 语言的新特性,还是在“与 Swift 协同工作”这种 Topic 里讲的,越发凸显这门语言的边缘化了,不过有新特性还是极好的,接下来,本文将介绍下面三个主要的新特性:

Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备

这是一个正在研发的API或技术的概要文件,苹果公司提供这些信息主要是为了帮助你通过苹果产品使用这些技术或者编程接口而做好计划,该信息有可能会在未来发生改变,本文当中提到的软件应该以最终发布的操作系统测试和最终文档为准,未来有可能会提供新版本的文档信息. Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中 使用 Swift 的 API.这种

给swift程序猿留下深刻印象的10个Swift代码

通过使用单行代码完成同样的 10 个练习,我们来看看 Swift 和其他语言之间的较量. 将数组中每个元素的值乘以 2 使用map来实现 var arr = [1,2,3,4]; var newArr = arr.map{$0*2} for item in newArr { print(item) } 代码简单明了地完成了数组元素乘2 求一组数字的和 这个问题可以通过使用 reduce 方法和加号运算符解决,这是因为加号运算符实际上也是一个函数.不过这个解法是非常显而易见的,待会儿我们会看到 r