1、存储属性

      1. 作为特定类或结构实例的一部分,存储属性存储着常量或者变量的值。

存储属性可分为变量存储属性(keywordvar描写叙述)和常量存储属性(keywordlet描写叙述)。

struct student{
let name = ""
var score = 0
}
let a = student(name:"小笨狼",score:96)

          注意:
               ① 定义储存属性时。须要为每个属性定义一个默认值。在初始化的时候,能够设置属性的初始值
               ② 对于结构当用let创建一个常量实例时(如let a)。这个实例中的属性将不可改变。即使属性是变量属性(a中的score属性也不可改变)。

这是由于结构是值类型。

当一个值类型实例作为常量而存在。它的全部属性也作为常量而存在。可是这个特性对类并不适用,由于类是引用类型

      2. 懒惰储存属性
          懒惰存储属性是当它第一次被使用时才进行初值计算。通过在属性声明前加上@lazy来标识一个懒惰存储属性。
          当属性初始值由于外部原因,在实例初始化完毕之前不能够确定时,就要定义成懒惰存储属性。当属性初始值须要复杂或高代价的设置,在它须要时才被赋值时,懒惰存储属性就派上用场了。

class student{
let name = ""
@lazy var score = 0
}
var a = student() //这时候score还为被创建
a.score = 98 //score第一次使用时才会被创建
println(a.score) //输出:98

          注意:
               ① 懒惰存储属性必须是变量属性(var定义的属性),由于它的初始值直到实例初始化完毕之后才被检索。常量属性在实例初始化完毕之前就应该被赋值,因此常量属性不能够被声明为懒惰存储属性。

假设声明。编译器会报错

2. 计算属性

       1. 基本操作
          除了存储属性。类、结构和枚举能够定义计算属性。计算属性并不存储值。它提供getter和可选的setter来间接地获取和设置其他的属性和值。

struct XSize{
var xOrigin:Float = 0
var length:Float = 0
}
class test{
var size = XSize()
var center:Float{
get{
return size.xOrigin + size.length/2
} //get方法。获取值
set(newSize){
size.xOrigin = newSize - size.length/2
} //set方法,存储值
}
}

          如上面样例所看到的,center并不存储值,仅仅是提供getter和可选的setter来间接地获取和设置其他的属性和值。

     2.setter声明的简略写法
          假设计算属性的setter方法没有将被设置的值定义一个名称。将会默认地使用newValue这个名称来取代。

class test{
var size = XSize()
var center:Float{
get{
return size.xOrigin + size.length/2
} //get方法,获取值
set{
size.xOrigin = newValue - size.length/2
} //set方法,存储值
}
}

     

     3. 仅仅读计算属性
          仅仅读计算属性仅仅带有一个getter方法,通过点操作符。能够放回属性值,可是不能改动它的值。

class test{
var size = XSize()
var center:Float{
get{
return size.xOrigin + size.length/2
} //get方法,获取值
}
}

          能够通过移除getkeyword和它的大括号。简化仅仅读计算属性的定义:

class test{
var size = XSize()
var center:Float{
return size.xOrigin + size.length/2
} //get方法,获取值
}

          注意:
               ① 计算属性(包括仅仅读计算属性)应该使用varkeyword,由于它们的值并非固定的。

letkeyword仅仅被常量属性说使用。假设使用let定义。编译器将会报错
               ② 使用计算属性一定要声明类型,否则编译器会报错

3. 属性观察者
          属性观察者观察属性值的改变并对此做出响应。

当设置属性的值时,属性观察者就被调用。即使当新值同原值同样时也会被调用。

          除了懒惰存储属性。你能够为不论什么存储属性加上属性观察者定义。

另外。通过重写子类属性,也能够继承属性(存储或计算)加上属性观察者定义。属性重写在“重写”章节定义。

class student{
var name:String = "abc"{
willSet(newName){
println("will set new:\(newName)") //输出:will set new:小笨狼
}
didSet(oldName){
println("did set new:\(name),old:\(oldName)") //输出:did set new:小笨狼,old:abc
}
}
}
let a = student()
a.name = "小笨狼"

          注意:
               ① 对属性加入观察者必须声明属性类型,否则编译器报错
               ② willSet能够带一个newName的參数,假设不这种话,这个參数就默认地被命名成newValue。
               ③ didSet也能够带一个oldName的參数,表示旧的属性,假设不带。这个參数默认命名为oldValue
               ④ 属性初始化时。willset和didSet并不会被调用。仅仅有在初始化上下文之外,当设置属性值时才被调用
               ⑤ willSet和didSet每次设置属性值时都会被调用,即使是设置的值和原来值同样

4. 全局和局部变量
          以上所写的关于计算与观察属性值的特性同样适用于全局和局部变量。

全局变量是在不论什么函数、方法、闭包、类型上下文外部定义的变量。而局部变量是在函数、方法、闭包中定义的变量。

          前面章节所遇到过的全局、局部变量都是存储变量。和存储属性一样,存储变量为特定类型提供存储空间而且能够被訪问
          可是。你能够在全局或局部范围定义计算变量和存储变量观察者。计算变量并不存储值,仅仅用来计算特定值,它的定义方式与计算属性一样。

     注意:
          全局常量和变量一般是延迟计算的,跟懒惰存储属性一样,可是不须要加上@lazy。而局部常量与变量不是延迟计算的。

5. 类型属性
          实例属性是特定类型实例的属性。当创建一个类型的实例时,这个实例有自己的属性值的集合,这将它与其他实例区分开来。

          也能够定义属于类型本身的属性,即使创建再多的这个类的实例。这个属性也不属于不论什么一个。它仅仅属于类型本身,这种属性就称为类型属性。

    1. 类型属性定义
          对值类型而言。定义类型属性使用statickeyword,而定义类类型的类型属性使用classkeyword。

以下的样例展示了存储和计算类型属性的使用方法:

struct Student{
static var name = ""
static var score:Int{
return 0
}
}
class School{
class var name:String{
return "NB小学"
}
}

          注意:
               上面的样例是针对仅仅读计算类型属性而言的,只是你也能够像计算实例属性一样定义可读可写的计算类型属性
     2. 查询与设置类型属性
          像实例属性一样,类型属性通过点操作符来查询与设置。可是类型属性的查询与设置是针对类型而言的,并非针对类型的实例。比如:

Student.name = "小笨狼"
println(Student.name) //输出:小笨狼
println(School.name) //输出:NB小学

          重点:
               通过类的名称来訪问属性

Swift学习笔记十:属性的更多相关文章

  1. Swift学习笔记十五

    自动引用计数(Automatic Reference Counting) 和OC一样,Swift用自动引用计数机制来跟踪和管理你应用程序的内存,大多数情况下,你不需要考虑自己管理内存,Swift会自动 ...

  2. Swift学习笔记十四

    Deinitialization 当类的实例对象即将要被释放时,会立即调用deinitializer,通过deinit关键字来定义deinitializer,和initializer一样,它也只存在于 ...

  3. Swift学习笔记十二

    方法 方法就是和某种特定类型相关联的函数.类.结构体.枚举都可以定义实例方法和类型方法.类型方法和OC中的类方法类似. 结构体和枚举也可以定义方法是Swift与C/OC之间很大的一个区别,在OC中,只 ...

  4. Swift学习笔记十

    枚举 一个枚举为一组相关联的值定义一个通用类型,并且让你可以在代码中类型安全地操作这些值. C中的枚举将关联的名字指派给一系列整型值.Swift中的枚举类型更为活泼,并不需要为每个成员指定值,如果指定 ...

  5. Swift学习笔记十六:协议

    Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法 ...

  6. Swift 学习笔记十五:扩展

    扩展就是向一个已有的类.结构体或枚举类型加入新功能(functionality).扩展和 Objective-C 中的分类(categories)相似.(只是与Objective-C不同的是,Swif ...

  7. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...

  8. Swift学习笔记(13)--属性 (Properties)

    普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImp ...

  9. swift学习笔记之-属性

    //属性 import UIKit //属性(Properties)详解 /* 存储属性(Stored Properties):类.结构体中,不能在枚举中 计算属性(Computed Properti ...

随机推荐

  1. SQLServer之视图篇

    1 视图介绍          视图是从一个或者几个基本表(或视图)导出的表.它与基本表不同,是一个虚表.数据库中只存放视图的定义,而不存在视图对应的数据,这些数据仍然存放在原来的基本表中.所以一旦基 ...

  2. C++标准模板库STL

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码 ...

  3. C#获取电脑型号、系统版本、内存大小、硬盘大小、CPU信息

    摘要 有时需要获取电脑的相关信息.这时可以通过调用windows api的方式,进行获取. 方法 可以通过在powershell中 通过下面的命令进行查询,然后可以通过c#调用获取需要的信息. gwm ...

  4. Unity主线程和子线程跳转调用(1)

    Unity除了一些基本的数据类型,几乎所有的API都不能在非unity线程中调用,如果项目中有一段很耗时操作,unity可能会出现“假死”.如果这段操作是和unity无关的,我们可以把这个耗时的操作放 ...

  5. [javaSE] 集合框架(体系概述)

    为什么出现集合类 为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合的不同 数组是固定长度的,集合是可变长度的 数组可以存储基本数据类型,集合只能存储对象 数组只能 ...

  6. Navicat相关应用及注意事项

    一.MySQL数据类型 1.数值型 SMALLINT: 2个字节 INT: 4个字节      // age int(10) INTEGER:INT的同义词 BIGINT : 8个字节 FLOAT : ...

  7. JSON 解析工具的封装(FastJSON-->Java)

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.添加依赖包 <dependency> <groupId>com.alibaba< ...

  8. javascript:this指向

    this常见指向问题 this的用法 1.直接在函数中使用 谁调用这个函数this就指向谁 2.对象中使用, 一般情况下指向该对象 3.在构造函数中使用 改变this的指向,两种方法的作用都是相同的, ...

  9. drupal7 覆写node-type.tpl.php获取字段值的两种方式

    字段的机读名称为:field_publication_date <!-- 下面两种方式都可以获取node字段的值--> 出版时间: <?php print date('Y-m-d', ...

  10. 将textarea实现自适应高度及IE下滚动条不出现的bug

    1.<el-table-column label="备注" width="180"> <template scope="scope& ...