原文地址: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. }
  8. }
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 

swift 声明特性 类型特性的更多相关文章

  1. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  2. Python3新特性 类型注解 以及 点点点

    Python3新特性 类型注解 以及 点点点 ... Python3 的新特性 Python 是一种动态语言,变量以及函数的参数是 不区分类型 的 在 函数中使用类型注解 相当于 给 形参的 类型 设 ...

  3. swift声明属性为某个类型同时遵循某协议

    swift声明属性为某个类型同时遵循某协议 var instanse:(协议A & 类B)

  4. TypeScript01 编译环境的搭建、字符串特性、类型特性

    知识准备:JavaScript满足ES5前端规范.TypeScript满足ES6前端规范 1 TypeScript开发环境 TypeScript代码不能直接被浏览器识别,必须先转换成JS代码:通常是利 ...

  5. c++新特性实验(2)类型特性

    1. 基本类型 1.1 增加 long long long long int signed long long signed long long int unsigned long long unsi ...

  6. Swift 语言附注 类型

    本页包括内容: 类型注解(Type Annotation) 类型标识符(Type Identifier) 元组类型(Tuple Type) 函数类型(Function Type) 数组类型(Array ...

  7. Swift语言之类型方法

    Swift语言有很多特性,其中之一就是类型方法,相对于其他比较流行的编程语言(C#.Java),在Swift中类型方法最大的特征在于它的可继承性,我们举个例子说明: 俗话说,龙生龙凤生凤老鼠生儿会打洞 ...

  8. [C#]Attribute特性(2)——方法的特性及特性参数

    上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...

  9. Swift声明参考

    一条声明可以在你的程序里引入新的名字和构造.举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型.你也可以使用一条声明来延长一个已经存在的命名好的类型 ...

随机推荐

  1. [Spring] Spring Boot 生态

  2. mybatis中if标签判断字符串相等问题

    mybatis 映射文件中,if标签判断字符串sfyx变量是否是字符串Y的时候,发现并不管用: <if test="sfyx=='Y' "> and 1=1 </ ...

  3. npm搭建React项目

    转自:http://blog.csdn.net/u012859720/article/details/70597119 要想使用npm,首先安装Node.js 一.安装全局包 $ npm instal ...

  4. [CodeForces522B] Photo to Remember

    某一天,n个朋友在一起聚会,他们已经很久没见了,于是他们决定拍照留念. 简单的说,拍照的时候,每个人有一个高度和宽度,第i个的高度和宽度分别是hi和wi.这些人排成一条直线,照片的最小的面积必须包含所 ...

  5. C#之实体类

    一.为什么要用实体类? |  使程序简洁易懂,便于维护. |  暗合接口不变原则. |  体现面向对象思想.         举例说明: 不用实体类的三层 假如程序有所变动,需要增加一个参数,学生年龄 ...

  6. Oracle update时做表关联

    感觉还是sqlserver中的写法比较好理解,Oracle的写法都快把我搞晕了, 注意: 1.要修改的表,不要加入到子查询中,用别名在子查询中与其他表进行关联即可. 2.exsits不能少,exsit ...

  7. CSS框架Bootstrap

    作为一个软件开发人员,经常接触和使用框架是再平常的事情不过了.但是这些框架基本都是和语言相关的,比如WEB框架SpringMVC,JavaEE框架Spring,ORM框架Hibernate,还有Jav ...

  8. CNN结构:用于检测的CNN结构进化-一站式方法

    有兴趣查看原文:YOLO详解 人眼能够快速的检测和识别视野内的物体,基于Maar的视觉理论,视觉先识别出局部显著性的区块比如边缘和角点,然后综合这些信息完成整体描述,人眼逆向工程最相像的是DPM模型. ...

  9. web前端技术与原生技术的竞争, 及未来的发展

    用户界面领域: web技术与原生技术之争 除了浏览器中运行之外, html5的技术也在app领域和移动端的安卓, iOS, 以及桌面端的window, linux以及OS X展开了竞争. 同样属于用户 ...

  10. 07--c++类的构造函数详解

    c++类的构造函数详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特 ...