swift 声明特性 类型特性

原文地址:http://www.cocoachina.com/newbie/basic/2014/0612/8801.html

特性提供了关于声明和类型的很多其它信息。在Swift中有两类特性,用于修饰声明的以及用于修饰类型的。

比如,required特性,当应用于一个类的指定或便利初始化器声明时。表明它的每一个子类都必须实现那个初始化器。再比方noreturn特性,当应用于函数或方法类型时,表明该函数或方法不会返回到它的调用者。

 
通过下面方式指定一个特性:符号@后面跟特性名,假设包括參数,则把參数带上:
 
有些声明特性通过接收參数来指定特性的很多其它信息以及它是怎样修饰一个特定的声明的。这些特性的參数写在小括号内,它们的格式由它们所属的特性来定义。
 
声明特性

声明特性仅仅能应用于声明。

然而。你也能够将noreturn特性应用于函数或方法类型。

 
assignment
该特性用于修饰重载了复合赋值运算符的函数。重载了复合赋值运算符的函数必需将它们的初始输入參数标记为inout。

怎样使用assignment特性的一个样例。请见:复合赋值运算符。

 
class_protocol
该特性用于修饰一个协议表明该协议仅仅能被类类型採用[待改:adopted]。
 
假设你用objc特性修饰一个协议,class_protocol特性就会隐式地应用到该协议,因此无需显式地用class_protocol特性标记该协议。
 
exported
该特性用于修饰导入声明。以此来导出已导入的模块,子模块,或当前模块的声明。假设还有一个模块导入了当前模块。那么那个模块能够訪问当前模块的导出项。
 
final
该特性用于修饰一个类或类中的属性,方法,以及下标成员。

假设用它修饰一个类,那么这个类则不能被继承。假设用它修饰类中的属性,方法或下标,则表示在子类中,它们不能被重写。

 
lazy
该特性用于修饰类或结构体中的存储型变量属性。表示该属性的初始值最多仅仅被计算和存储一次,且发生在第一次訪问它时。怎样使用lazy特性的一个样例,请见:惰性存储型属性。

 
noreturn
该特性用于修饰函数或方法声明,表明该函数或方法的相应类型,T,是@noreturn T。

你能够用这个特性修饰函数或方法的类型,这样一来,函数或方法就不会返回到它的调用者中去。

 
对于一个没实用noreturn特性标记的函数或方法,你能够将它重写(override)为用该特性标记的。相反。对于一个已经用noreturn特性标记的函数或方法,你则不能够将它重写为没使用该特性标记的。同样的规则试用于当你在一个comforming类型中实现一个协议方法时。

 
NSCopying
该特性用于修饰一个类的存储型变量属性。该特性将使属性的setter与属性值的一个副本合成,由copyWithZone方法返回。而不是属性本身的值。该属性的类型必需遵循NSCopying协议。

 
NSCopying特性的行为与Objective-C中的copy特性相似。

 
NSManaged
该特性用于修饰NSManagedObject子类中的存储型变量属性,表明属性的存储和实现由Core Data在执行时基于相关实体描写叙述动态提供。
 
objc
该特性用于修饰随意能够在Objective-C中表示的声明,比方。非嵌套类,协议,类和协议中的属性和方法(包括getter和setter),初始化器。析构器,下面下标。objc特性告诉编译器该声明能够在Objective-C代码中使用。

 
假设你将objc特性应用于一个类或协议。它也会隐式地应用于那个类或协议的成员。对于标记了objc特性的类,编译器会隐式地为它的子类加入objc特性。标记了objc特性的协议不能继承自没有标记objc的协议。
 
objc特性有一个可选的參数。由标记符组成。当你想把objc所修饰的实体以一个不同的名字暴露给Objective-C,你就能够使用这个特性參数。你能够使用这个參数来命名类。协议。方法,getters,setters,以及初始化器。以下的样例把ExampleClass中enabled属性的getter暴露给Objective-C,名字是isEnabled,而不是它原来的属性名。
  1. @objc 
  2. class ExampleClass { 
  3.     var enabled: Bool { 
  4.     @objc(isEnabled) get { 
  5.         // Return the appropriate value 
  6.     } 
  7.     } 
optional
用该特性修饰协议的属性,方法或下标成员。表示实现这些成员并不须要一致性类型(conforming type)。

 
你仅仅能用optional特性修饰那些标记了objc特性的协议。因此。仅仅有类类型能够adopt和comform to那些包括可选成员需求的协议。

很多其它关于怎样使用optional特性以及怎样訪问可选协议成员的指导,比如,当你不确定一个conforming类型是否实现了它们。请见:可选协议需求。

 
required
用该特性修饰一个类的指定或便利初始化器。表示该类的全部子类都必需实现该初始化器。

 
加了该特性的指定初始化器必需显式地实现,而便利初始化器既可显式地实现,也能够在子类实现了超类全部指定初始化器后继承而来(或者当子类使用便利初始化器重写了指定初始化器)。
 
Interface Builder使用的声明特性
Interface Builder特性是Interface Builder用来与Xcode同步的声明特性。Swift提供了下面的Interface Builder特性:IBAction。IBDesignable,IBInspectable,以及IBOutlet。这些特性与Objective-C中相应的特性在概念上是同样的。
 
IBOutlet和IBInspectable用于修饰一个类的属性声明;IBAction特性用于修饰一个类的方法声明;IBDesignable用于修饰类的声明。

 
 
类型特性

类型特性仅仅能用于修饰类型。

然而,你也能够用noreturn特性去修饰函数或方法声明。

 
auto_closure
这个特性通过自己主动地将表达式封闭到一个无參数闭包中来延迟表达式的求值。使用该特性修饰无參的函数或方法类型,返回表达式的类型。

一个怎样使用auto_closure特性的样例,见函数类型

 
noreturn
该特性用于修饰函数或方法的类型。表明该函数或方法不会返回到它的调用者中去。你也能够用它标记函数或方法的声明。表示函数或方法的对应类型,T,是@noreturn T。
 

特性的语法:

 

attribute  attribute-name­attribute-argument-clause­opt­

attribute-name  identifier­

attribute-argument-clause  balanced-tokens­opt­

attributes  attribute­attributes­opt­

balanced-tokens  balanced-token­balanced-tokens­opt­

balanced-token  balanced-tokens­opt­

balanced-token  balanced-tokens­opt­

balanced-token  balanced-tokens­opt­

balanced-token  Any identifier, keyword, literal, or operator

balanced-token  Any punctuation except , , , , , or 

posted @ 2017-06-30 10:52  brucemengbm  阅读(337)  评论(0编辑  收藏  举报