iOS开发——swift篇&经典语法(四)特性

特性

特性提供了关于声明和类型的更多信息。在Swift中有两类特性,用于修饰声明的以及用于修饰类型的。例如,required特性,当应用于一个类的指定或便利初始化器声明时,表明它的每个子类都必须实现那个初始化器。再比如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特性标记的函数或方法,你则不可以将它重写为没使用该特性标记的。相同的规则试用于当你在一个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,以及初始化器。下面的例子把ExampleClassenabled属性的getter暴露给Objective-C,名字是isEnabled,而不是它原来的属性名。

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

optional

用该特性修饰协议的属性,方法或下标成员,表示实现这些成员并不需要一致性类型(conforming type)。

你只能用optional特性修饰那些标记了objc特性的协议。因此,只有类类型可以adopt和comform to那些包含可选成员需求的协议。更多关于如何使用optional特性以及如何访问可选协议成员的指导,例如,当你不确定一个conforming类型是否实现了它们,请见:可选协议需求。

required

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

加了该特性的指定初始化器必需显式地实现,而便利初始化器既可显式地实现,也可以在子类实现了超类所有指定初始化器后继承而来(或者当子类使用便利初始化器重写了指定初始化器)。

Interface Builder使用的声明特性

Interface Builder特性是Interface Builder用来与Xcode同步的声明特性。Swift提供了以下的Interface Builder特性:IBActionIBDesignableIBInspectable,以及IBOutlet。这些特性与Objective-C中对应的特性在概念上是相同的。

IBOutletIBInspectable用于修饰一个类的属性声明;IBAction特性用于修饰一个类的方法声明;IBDesignable用于修饰类的声明。

类型特性

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

auto_closure

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

noreturn

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

时间: 2024-10-08 05:14:33

iOS开发——swift篇&经典语法(四)特性的相关文章

iOS开发——swift篇&经典语法(二十四)可选链

可选链 可选链(Optional Chaining)是一种可以请求和调用属性.方法及子脚本的过程,它的自判断性体现于请求或调用的目标当前可能为空(nil).如果自判断的目标有值,那么调用就会成功:相反,如果选择的目标为空(nil),则这种调用将返回空(nil).多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为空(nil)将导致整个链失效. 注意: Swift 的自判断链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使用在任意类型中,并且失败与否可以被检测到.

iOS开发——swift篇&经典语法(八)初始化

初始化 初始化是类,结构体和枚举类型实例化的准备阶段.这个阶段设置这个实例存储的属性的初始化数值和做一些使用实例之前的准备以及必须要做的其他一些设置工作. 通过定义构造器(initializers)实现这个实例化过程,也就是创建一个新的具体实例的特殊方法.和Objective-C不一样的是,Swift的构造器没有返回值.它们主要充当的角色是确保这个实例在使用之前能正确的初始化. 类实例也能实现一个析构器(deinitializer),在类实例销毁之前做一些清理工作.更多的关于析构器(deinit

iOS开发——swift篇&经典语法(二十七)Swift与Objective-C简单对比

Swift与Objective-C的对比 系列(一) WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有半点风声的走漏.消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧.于是熬夜学习了Swift大法,越看越想高呼 ” Swift大法好!“ 程序员,最讲究的就是实事求是和客观,下面就开始对比两种语言. 首先要强调的是,Swift绝对不是解释性语言,更不是脚本语言,它和Objective-C,C++一样,编译器最终会把它翻译成

iOS开发——swift篇&经典语法(十七)类与结构

类与结构 类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文件来使用类或者结构.Swift中的类或者结构可以在单文件中直接定义,一旦定义完成后,就能够被直接其它代码使用. 注意:一个类的实例一般被视作一个对象,但是在Swift中,类与结构更像是一个函数方法,在后续的章节中更多地是讲述类和结构的功能性. 1.类和结构的异同 类和结构有一些相似的地方,

iOS开发——swift篇&经典语法(十六)枚举类型

枚举类型 枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们. 如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值.在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值.如果一个值(被称为“原始”的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值. 另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体.你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组

iOS开发——swift篇&经典语法(二十一)泛型

泛型 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活且可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图. 泛型是 Swift 强大特征中的其中一个,许多 Swift 标准库是通过泛型代码构建出来的.事实上,泛型的使用贯穿了整本语言手册,只是你没有发现而已.例如,Swift 的数组和字典类型都是泛型集.你可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组.同样的,你也可以创建存储任何指定类型

iOS开发——swift篇&经典语法(十三)复合类型

集合类型 Swift 提供两种集合类型来存储集合,数组和字典.数组是一个同类型的序列化列表集合.字典是一个能够使用类似于键的唯一标识符来获取值的非序列化集合. 在Swift中,数组和字典的键和值都必须明确它的类型.这意味这数组和字典不会插入一个错误的类型的值,以致于出错.这也意味着当你在数组和字典中取回数值的时候能够确定它的类型. Swift 使用确定的集合类型可以保证代码工作是不会出错,和让你在开发阶段就能更早的捕获错误. note: Swift的数组 储存不同的类型会展示出不同的行为,例如变

iOS开发——swift篇&经典语法(三)语句

语句 在 Swift 中,有两种类型的语句:简单语句和控制流语句.简单语句是最常见的,用于构造表达式和声明.控制流语句则用于控制程序执行的流程,Swift 中有三种类型的控制流语句:循环语句.分支语句和控制传递语句. 循环语句用于重复执行代码块:分支语句用于执行满足特定条件的代码块:控制传递语句则用于修改代码的执行顺序.在稍后的叙述中,将会详细地介绍每一种类型的控制流语句. 是否将分号(;)添加到语句的结尾处是可选的.但若要在同一行内写多条独立语句,请务必使用分号. GRAMMAR OF A S

iOS开发——swift篇&经典语法(十)属性

属性 属性是描述特定类.结构或者枚举的值.存储属性作为实例的一部分存储常量与变量的值,而计算属性计算他们的值(不只是存储).计算属性存在于类.结构与枚举中.存储属性仅仅只在类与结构中. 属性通常与特定类型实例联系在一起.但属性也可以与类型本身联系在一起,这样的属性称之为类型属性. 另外,可以定义属性观察者来处理属性值发生改变的情况,这样你就可以对用户操作做出反应.属性观察者可以被加在自己定义的存储属性之上,也可以在从父类继承的子类属性之上. 1.存储属性 最简单的情形,作为特定类或结构实例的一部