Swift类型兼容性
定义一个继承自NSObject
或者其他Objective-C的类,它自动与Objective-C兼容。如果你不需要将Swift对象导入Objective-C代码的话,没必要关注类型的兼容性。但是如果在Swift中定义的类不是Objective-C类的子类,在Objective-C中使用的时候,需要用@objc
进行说明。
@objc
使得Swift的API可以在Objective-C和它的运行时中使用。当使用@IBOutlet
、@IBAction
或者@NSManaged
等属性时,自动添加@objc
属性。
@objc还可以用来指定Swift中的属性或方法在Objective-C中的名字,比如Swift支持Unicode名字,包括使用中文等Objective-C不兼容的字符。还有给Swift中定义的函数指定一个Selectorde名字。
@objc(Squirrel)
class 长沙戴维营教育 {
@objc(hideNuts:inTree:)
func 欢迎光临(Int,姓名: String) {
/* ... */
}
}
当@objc(<#name#>)
属性作用在Swift的类上时,这个类在Objective-C的使用不受命名空间的限制。同样,在Swift中解归档Objective-C归档的对象时,由于归档对象中存放有类名,因此需要在Swift中用@objc<#name>
说明Objective-C的类名。
Objective-C选择器(Selector)
Objective-C的选择器是方法的一个引用。在Swift中对应的是Selector
结构体。使用字符串字面量可以构建一个选择器对象,如let mySelector: Selector = "tappedButton:"
。由于字符串字面常量可以自动转换为选择器对象,因此可以在任何需要传递选择器的地方使用字符串字面常量。
<code class="ocaml hljs" data-origin="" <pre><code="" uikit"="" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110,107,94); font-family: Consolas,monospace !important;">import UIKit
class MyViewController: UIViewController {
let myButton = UIButton(frame: CGRect(x: 0,y: 100,height: 50))
init(nibName nibNameOrNil: String!,bundle nibBundleOrNil: NSBundle!)
{
super.init(nibName: nibName,bundle: nibBundle)
myButton.targetForAction("tappedButton:",withSender: self)
}
func tappedButton(sender: UIButton!) {
println("tapped button")
}
}
如果Swift类继承自Objective-C的类,则它里面的方法和属性都能够作为Objective-C的选择器使用。而如果不是Objective-C的子类,需要使用@objc
属性修饰,这个在前面的Swift类型兼容性中有描述。