Swift公有“@”注解属性的全面介绍

你是否听说过Swift语言的属性?在这篇文章中我收集了所有的Swift注解属性并简单地介绍了各个属性的意义。

公有属性

公有的Swift语言属性用“@”标记,类似于java中的注解,这些属性绝大多数都有正规的文档记载并且可以在代码中使用。我们接下来就对全部的公有属性进行介绍,其中的大多数属性看起来都很熟悉。

@IBOutlet

如果你用@IBOutlet属性标记一个属性,那么Interface BuilderIB)将识别那个变量,并且你将能够通过提供的“outlet”机制将你的源代码与你的XIB或者Storyboard连接起来。

@IBAction

@IBOutlet类似,@IBAction同样是连接代码和Interface Builder的桥梁,只不过@IBAction连接的是func函数,而不是属性。被标记的方法将直接接收由用户界面触发的事件。

@IBInspectable, @GKInspectable

我们经常用Interface Builder的属性编辑面板对控件的属性进行设置,但是还有一些属性并没有暴露在Interface Builder的设置面板中。用@IBInspectable标记一个NSCodable的属性将会使它可以很容易地在Interface Builder的属性面板编辑器中进行编辑。@GKInspectable@IBInspectable有着相同的行为,但是该属性主要用在SpriteKitUI编辑器中而不是IB中(面向游戏开发)。


@IBDesignable

当给一个UIView或者NSView的子类应用@IBDesignable时,这个类就可以显示在Interface Builder中,使我们的代码变得“所见即所写”,我们对代码的修改也可以实时的反馈在Interface Builder中。

@UIApplicationMain, @NSApplicationMain

这个属性使被标记的类作为本应用的代理。通常来说,这个代理类都是系统自动创建的AppDelegate.swift文件。如果你不想用@UIApplicationMain这个注解,你可以自己手动创建一个main.swift文件并且在这个文件中调用UIApplicationMain的方法。这个文件会代替@UIApplicationMain的作用。不过,请不要这么做!!!

@available

通过@available使得被标记的方法或属性适用于不同的平台或系统版本。


@NSCopying

你可以用这个属性标记一个属性来复制它,而不是属性本身的值。显然,当您复制引用类型时,这是非常有用的。

@NSManaged

如果你使用了Core Data的实体类(通常是NSManagedObject的子类),你可以将存储的变量或实例方法标记为@NSManaged,以表明Core Data框架会在运行时动态地提供实现。

@objcMembers

通常在项目中如果想把Swift写的API暴露给Objective-C调用,需要增加@objc。这个@objcMembers是一个便捷方法来标记一个类的全部方法都加上@objc。不过这个属性会引起性能问题。

@escaping

如果你希望被标记的值可以存储起来以便后续代码继续使用,你可以将闭包的参数标记为@escaping,换句话说,被标记的值的可以超越原来的生命周期范围,被外界调用。

@discardableResult

默认情况下,如果调用一个函数,但函数的返回值并未使用,那么编译器会发出警告。你可以通过给func使用@discardableResult来抑制警告。

@autoclosure

这个注解比较难以解释:如果一个func有一个闭包参数,这个闭包参数没有形参但有返回类型。@autoclosure可以神奇地把这样的func转换成有一个参数且这个参数的类型就是闭包的返回值类型的func。这样的好处是在调用这个带闭包的func时,传的实参不用非得是闭包类型,只要是闭包返回值类型的就可以了,@autoclosure会自动把这个值转换成闭包类型。

@testable

当你想要在测试类中导入某些模块以进行单元测试时就会用到这个注解。在一般情况下,被声明为internal的方法和属性是模块内部访问的,在模块之外是不可以被访问的。然而,单元测试要求我们能访问到internal的方法或属性,因此我们可以在单元测试文件中import需要测试的模块前添加@testable。不过,被声明为privatefileprivate的内容依然不能被访问。

@objc

这个属性就是关联Swift对象和OC对象的桥梁。你还可以通过@objc提供一个标识符,这个标识符就是对应到OC中的类或方法。

@nonobjc

使用这个属性来禁止隐式添加@objc属性。@nonobjc告诉编译器当前声明的内容不能在OC中使用,即便它在OC中可以被表示。

@convention

这个注解也比较难以解释:它用来修饰func,而且它还带有一个参数,这个参数的取值一般是:swiftcblock。被修饰的func可以用来匹配其他语言平台的函数指针类型的形参。例如:

1. 当调用C函数的时候,可以传入被@convention(c)修饰的swift函数,来匹配C函数形参中的函数指针。

2. 当调用OC方法的时候,可以传入被@convention(block)修饰的swift函数,来匹配OC方法形参中的block参数。

以上就是Swift全部的公有“@”注解属性的介绍,其中绝大部分都比较熟悉了。当然,Swift还有很多私有的注解属性。私有属性只能由语言的创建者或核心开发人员使用,他们提供了额外的编译器功能。所以,如果你要使用这些私有属性,请一定小心。

我们会在下一篇文章中介绍Swift的私有属性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章