Files
the-swift-programming-langu…/source/chapter3/06_Attributes.md
2014-06-09 00:40:17 +08:00

4.4 KiB
Raw Blame History

特性

特性提供了关于声明和类型的更多信息。在Swift中有两类特性应用于声明的以及应用于类型的。例如required属性,当应用于一个类的[待改designated或convenience]初始化器声明时,表明它的每个子类都必须实现那个初始化器。再比如noreturn特性,当应用于函数或方法类型时,表明该函数或方法不会返回到它的调用者。

通过以下方式指定一个特性:符号@后面跟特性名,如果包含参数,则把参数带上:

@attribute name
@attribute name(attribute arguments)

有些声明特性通过接收参数来指定特性的更多信息以及它是如何应用于一个特定的声明的。这些特性的参数写在小括号内,它们的格式由它们所属的特性来定义。

声明特性

声明特性只能应用于声明。然而,你也可以将noreturn特性应用于函数或方法类型。

assignment

对重载了复合赋值运算符的函数应用这个特性。重载了复合赋值运算符的函数必需将它们的初始输入参数标记为inout。如何使用assignment特性的一个例子,请见:复合赋值运算符

class_protocol

对一个协议应用该特性表明该协议只能被类类型采用[待改adopted]。

如果你应用objc特性到一个协议,class_protocol特性就会隐式地应用到该协议,因此无需显式地用class_protocol特性标记该协议。

exported

对一个导入声明应用该特性,以此来导出已导入的模块,子模块,或当前模块的声明。如果另一个模块导入了当前模块,那么那个模块可以访问当前模块的导出项。

final

对一个类或类中的属性,方法,下标成员应用这个特性。如果将它应用于一个类,那么这个类则不能被继承。如果将它应用于类中的属性,方法或下标,则表示在子类中,它们不能被重写。

lazy

对类或结构体中的存储型变量属性应用该特性,表示该属性的初始值最多只被计算和存储一次,且发生在第一次访问它时。如何使用lazy特性的一个例子,请见:惰性存储型属性

noreturn

对一个函数或方法声明应用该特性,表明该函数或方法的对应类型,T,是@noreturn T。你可以用这个特性标记函数或方法的类型,这样一来,函数或方法就不会返回到它的调用者中去。

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

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你就可以使用这个特性参数。你可以使用这个参数来命名类协议方法getterssetters以及初始化器。下面的例子把ExampleClassenabled属性的getter暴露给Objective-C名字是isEnabled,而不是它原来的属性名。

@objc
class ExampleClass {
    var enabled: Bool {
    @objc(isEnabled) get {
        // Return the appropriate value
    }
    }
}

optional