您的位置:首页 > 移动开发 > Swift

swift与oc的互用--使用oc特性编写swift

2015-01-10 16:21 246 查看
转自译者:halinuya(git主页)

互用性使得开发者可以定义包含了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 的类名。
SWIFT

import UIKit

class MySwiftViewController: UIViewController {
// define the class
}


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

适配协议

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

class MySwiftViewController: UIViewController, UITableViewDelegate,     UITableViewDataSource {
// 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 方法。

集成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的类:
SWIFT

class MyViewController: UIViewController {

@IBOutlet var button: UIButton

@IBOutlet var textFields: UITextField[]

@IBAction func buttonTapped(AnyObject) {
println("button tapped!")
}
}


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

实时渲染(live rendering)

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

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

@IBDesignable

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


指明属性特性

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

强类型和弱类型

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

读/写和只读

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

拷贝语义

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

实现Core Data Managed Object Subclasses

Core Data提供了NSManagedObject子类中属性的底层储存和实现。在Core Data模型中,在与管理对象子类相关的特性或者关系的每个属性定义之前添加 @NSmanaged 特性加入。与Objective-C里面的 @dynamic 特性类似, @NSManaged 特性告知Swift的编译器--这个属性的存储和实现将在运行时提供。但是与 @dynamic 不同, @NSManaged 特性仅供Core Data支持
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: