首页 >iOS开发

Using Swift with Cocoa and Objective-C--利用现有ObjC类及框架资源编写Swif

2014-06-12 14:26 编辑: suiling 分类:iOS开发 来源:CocoaChina

Swift系列文章由CocoaChina翻译小组翻译自苹果的官方文档:The Swift Programming Language--Interoperability--Writing Swift Classes with Objective-C Behavior。 本篇译者:halinuya(git主页),敬请勘误,欢迎在CocoaChina github主页 查看更多文章。

 

互用性使得开发者可以定义包含了Objective-C行为的Swift类。编写Swift的class类时,不仅能够子类化Objective-C类,采用Objective-C定义的协议接口,还能利用Objective-C的其它优势功能。这意味着开发者能够利用Objective-C中已有的熟悉的可靠的类、方法和框架创建新类,并结合swift提供的现代化和更有效的语言特性增强性新创建的类。

 

继承Objective-C的类

在Swift中,开发者能定义一个Objective-C类的子类。创建一个继承自Objective-C 类的Swift类,你可以在Swift类的名字后面,加上一个冒号(:),冒号后面跟随Objective-C 的类名。

  1. SWIFT 
  2.  
  3. import UIKit 
  4.  
  5. class MySwiftViewController: UIViewController { 
  6.     // define the class 

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

 

适配协议

在Swift中,开发者能够适配Objective-C中定义好的协议。和Swift协议一样,任何需要适配的Objective-C协议都是跟在父类后面,用逗号隔开。

  1. SWIFT 
  2.  
  3. class MySwiftViewController: UIViewController, UITableViewDelegate,     UITableViewDataSource { 
  4.     // define the class 

Object-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的初始化方法。关于实现开发者构造器的更多信息,请查看Initializers



当开发者希望在类被释放前执行额外的清理工作时,开发者需要实现一个析构器来代替 dealloc 方法。在实例被释放前,Swift会自动调用析构器来执行额外的清理工作。在调用完子类的析构器后,Swift会自动调用起父类的析构器。当你使用Objective-C类或者继承自Objective-C类的Swift类时,Swift会调用类的父类dealloc 方法。你可以在Deninitializer中查看更多关于实现自定义析构器的信息。

 

集成Interface Builder

Swift编译器包含一些属性,能让Interface Builder支持Swift类。和Objective-C里一样,你能在Swift里面使用OutLets,actions和实时渲染(live rendering)。

 

使用与Outlets和Action

Outlets和Action能让你把代码和Interface Builder中的界面对象连接起来。在Swift里面使用Outlets和Action,需要在属性和方法声明前插入 @IBOutlet 或者 @IBAction 关键字。当使用 @IBOutlet 属性来声明Outlets集合时,仅为类型指明了一个数组。

 

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

 

举例说明,下面的Swift代码声明了一个拥有Outlet,Outlets集合以及Action的类:

  1. SWIFT 
  2.  
  3. class MyViewController: UIViewController { 
  4.  
  5.     @IBOutlet var button: UIButton 
  6.  
  7.     @IBOutlet var textFields: UITextField[] 
  8.  
  9.     @IBAction func buttonTapped(AnyObject) { 
  10.         println("button tapped!"
  11.     } 

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

 

实时渲染(live rendering)

开发者能够使用 @IBDesignable 和 @IBInspectable 两个不同的属性在Interface Builder中创建生动的,可交互的自定义视图(view)。当你创建了一个继承自UIView 或者 NSView的自定义视图时,你可以在类声明前添加 @IBDesignable 属性。当你在Interface Builder中里添加了自定义的视图后(在inspector pane中设置view的自定义类),Interface Builder将在画布上渲染你的视图。

 

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

 

你也可以使用兼容用户定义的运行时属性的类型把@IBInspectable添加至属性。。在你把自定义视图添加至Interface Builder后,你可以在inspector中编辑这些属性。

  1. SWIFT 
  2.  
  3. @IBDesignable 
  4.  
  5. class MyCustomView: UIView { 
  6.     @IBInspectable var textColor: UIColor 
  7.     @IBInspectable var iconHeight: CGFloat 
  8.     /* ... */ 

 

指明属性特性

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

 

强类型和弱类型

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

 

读/写和只读

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

 

拷贝语义

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

 

实现Core Data Managed Object Subclasses

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

 

本章由CocoaChina的翻译小组成员 halinuya(git主页翻译,转载请注明出处和译者信息,拒绝商业之用。

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
我要投稿   收藏文章
上一篇:The Swift Programming Language--语言指南--类型转换
下一篇:The Swift Programming Language--语言指南--协议
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部