Swift学习笔记十:属性
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学习笔记十:属性的更多相关文章
- Swift学习笔记十五
自动引用计数(Automatic Reference Counting) 和OC一样,Swift用自动引用计数机制来跟踪和管理你应用程序的内存,大多数情况下,你不需要考虑自己管理内存,Swift会自动 ...
- Swift学习笔记十四
Deinitialization 当类的实例对象即将要被释放时,会立即调用deinitializer,通过deinit关键字来定义deinitializer,和initializer一样,它也只存在于 ...
- Swift学习笔记十二
方法 方法就是和某种特定类型相关联的函数.类.结构体.枚举都可以定义实例方法和类型方法.类型方法和OC中的类方法类似. 结构体和枚举也可以定义方法是Swift与C/OC之间很大的一个区别,在OC中,只 ...
- Swift学习笔记十
枚举 一个枚举为一组相关联的值定义一个通用类型,并且让你可以在代码中类型安全地操作这些值. C中的枚举将关联的名字指派给一系列整型值.Swift中的枚举类型更为活泼,并不需要为每个成员指定值,如果指定 ...
- Swift学习笔记十六:协议
Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法 ...
- Swift 学习笔记十五:扩展
扩展就是向一个已有的类.结构体或枚举类型加入新功能(functionality).扩展和 Objective-C 中的分类(categories)相似.(只是与Objective-C不同的是,Swif ...
- Swift学习笔记十四:构造(Initialization)
类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态. 你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...
- Swift学习笔记(13)--属性 (Properties)
普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImp ...
- swift学习笔记之-属性
//属性 import UIKit //属性(Properties)详解 /* 存储属性(Stored Properties):类.结构体中,不能在枚举中 计算属性(Computed Properti ...
随机推荐
- OpenGL学习笔记:Console工程下如何不显示控制台黑窗口只显示Windows窗口
刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口. 其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows,程序的入口点改成m ...
- Redis集合操作
Redis的集合以无序的形式存储多个各不相同的元素 (常用的集合命令) SADD : SADD key-name item [item ...]----------将一个或多个元素添加到集合里,并返回 ...
- 50道sql练习题和答案
最近两年的工作没有写过多少SQL,感觉水平下降十分严重,网上找了50道练习题学习和复习 原文地址:50道SQL练习题及答案与详细分析 1.0数据表介绍 --1.学生表 Student(SId,Snam ...
- php json_encode在CI框架中的使用细节
这个错误的造成原因是加载类类库,转换成json格式的时候不熟悉CI框架的规定导致的,CI框架中规定在将数据转换成json格式的时候需要将类库小写,当然了,调用的时候必须保证有这个类库,且可以在对应的文 ...
- WebForm 【复合控件】
一 复合控件(取值,赋值用法相近) RadioButtonList --单选按钮 (一组列表) <asp:RadioButtonList ID="RadioButtonL ...
- (第一篇) 一步一步带你了解linq to Object
要想学好linq to object 我们必须要先学习lambda 表达式,学习lambda 表达式呢我们必须了解匿名函数和匿名类及扩展方法,学习匿名函数,我们必须学会委托,这是本文的宗旨.下面开始第 ...
- [日常] Go语言圣经-Slice切片习题
1.Slice(切片)代表变长的序列,序列中每个元素都有相同的类型,一个slice类型一般写作[]T,其中T代表slice中元素的类型:slice的语法和数组很像,只是没有固定长度而已,slice的底 ...
- h5新增加的存储方法
h4中使用的cookie把用户信息保存在客户端浏览器,但是它受到很多限制. 大小:最多能存储4k 带宽:它是随着http请求一起发送到服务器的,因此浪费一部分的带宽. 复杂度:操作复杂. h5新增加了 ...
- js相关判断
//正则表达式判断是否为空 /^\s*?$/.test(obj) //批量转换方法 function sort(s){return s.match(/\d/g).sort()+'' } //判断是否相 ...
- 树莓派 MPG视频硬件解码破解 Raspberry Pi Patch for MPEG-2, VC-1 license
Enable the Pi's hardware decoding of MPEG-2 and VC-1 MPEG2 patents have expired If you have start.e ...