创建: 2018/02/19

完成: 2018/02/25

【任务表】TODO

 构造体定义
 定义的概要
struct 型名 {
(变量/常量的定义)
(构造函数的定义)
(方法的定义)
(其他定义) // 型定义, 属性定义,索引定义等

● 构造体是值型

 构造体的初始值

默认构造函数: 所有属性都设定初始值的话可用

型名()

// 例 Class Sample {...}
Sample()

前提: 构造函数一个也没有的前提下才可用

 全项目构造函数

所有属性都指定的构造函数

型名(所有属性参数)

// 例 Class Sample {var a: Int; var b: Int}
Sample(a: , b: )

前提: 构造函数一个也没有的前提下才可用

 代入常数的结构体

代入常数的实例属性无法变更

值型

 构造体的常数属性

初始化后不能改变值

直接有初始值的,全项目构造函数时候忽略常数属性

没有的只能用全项目构造函数(没有自定义构造函数时), 或者使用自定义构造函数

 自定义构造函数

init(参数) {
...
}

● 直接获取属性,也可以明确用self来标明(self.属性名)

● 不是独立构造函数的话,先呼出self.init

● 自定义后默认构造函数和全项目构造函数都不可用了,想用要自定义

 嵌套类型  内部的其他类型
 类型的别名  typealias 新名 = 旧名
   
   
   
 方法
 实例方法的定义  和类里面的实例方法一样 
 变更构造体内容的方法(method)

一般不用,官方推荐构造体一个一个新建

必须把构造体声明为var

改变自身属性的方法前加上mutating

mutating func sample(...) { ... }
 静态方法

定义方法: 方法前加上static

呼出方法: 构造体类.静态方法

static func sample(...) -> ... { ... } // 定义

StructName.sample // 呼出
 构造函数与方法

类和结构体的所有属性设定完以前不能调用实例方法

规避方法:

● 先设定所有属性(推荐)

● 把需要的方法写成静态方法(不推荐)

● 方法定义在构造体外部(不推荐)

● var的话,延迟型属性

 构造体内部定义运算符

类和结构体相关的运算符定义在类/结构体内部

实现方法加上static

self表示的不是实例,是类。self呼出的方法是静态方法

 注意: 在函数内部的类/构造体不能自定义以及重载运算符

   
 属性
 属性的种类

● 容纳型属性(实例属性, 静态属性都可以)

● 计算型属性(实例属性, 静态属性都可以)

 静态属性

前面加static

静态方法处可以直接获取(不需要类名.)

静态方法改变类/构造体的静态变量不用加mutating

 容纳型属性的初始值用式子来设定 

容纳型属性可以用式子来初始化

var sample: Int = a + b //a, b已定义

● 静态属性的初始化式子只在需要的时候被评价一次,后面不会重复评价

 计算型属性 

由获取与更新值的步骤构成, 使用时和容纳型变量没有区别

var 属性名: 类型 {
get {
... // 返回属性的值
}
set(参数 | newValue) { // set可以省略, 参数可以省略
... // 更新属性的值
}
} // 只有get时可以省略为
var 属性名: 类型 {
... // get部分
}

● get, set顺序无所谓

● set可以省略

● set的参数可以省略, 参数只要参数名, 省略时为newValue

var sample: Int {
get {
...
}
set(data) { // 可以省略,省略则为newValue
...
}
}

● 类/构造体内使用计算型变量时必须先初始化该实例

● 可以用 +=

相当于 sample.property = newValue + sample.property

调用2次get,2次set

 向函数的inout参数传递属性

可以传递容纳型属性, 可读写属性(带get和set)

sample(&a.val, &b.val)

● 变量与容纳型属性传进去的是指针, 内部变化和外部变化同步

● 计算型变量复制进去,所以在函数执行完成后结果复制回原位置, 只改变一次

 计算型属性的特殊设定 

● get改变自身的属性, 加mutating

这样的属性代入常数无法获取该属性

(Cannot use mutating getter on immutable value: 'myTest3_3_v2' is a 'let' constant)

● set不改变自身属性, 加 nonmutating

这样的构造体代入常数该属性也可以代入

 全局范围的计算型属性的定义   全局范围也可以定义计算型属性
 属性监听器(obsever)

容纳型属性更新前后进行一些操作的机制

var 属性名: 类型 = 初始值 { // 初始值可以省略不设定
willSet(参数 | newValue) { // did/will两者可以省略一个, 顺序不限
... // 值改变前的操作
}
didSet(参数 | oldValue) { // did/will两者可以省略一个, 顺序不限
... // 值改变以后的操作
}
}

● willSet的参数省略了则为 newValue

● didSet的参数省略了则为 oldValue

● didSet内部可以改变自己的值,但不会递归地呼出didSet

● 传入inout参数时是复制进去, 函数结束时结果来改变值。 也就是didSet只运行一次

   
 索引(添字付け)
 索引(subscript)

对多个属性, 像数组一般获取的功能

● 可用于一切, 读写与只可读等等也没有限制

subscript(参数) -> 类型 {
get {
... // 返回索引对应的值
}
set (参数 | newValue) { // 可省略参数, 可省略set
... // 更新属性
}
} // 只有get的时候
subscript(参数) -> 类型 {
... // // 返回索引对应的值
}

● 可以作为inout参数, &sample[10]

● set的参数默认为newValue

 索引的变更 

● 参数类型,数量没有限制

subscript(a: Int, b: String, c: Bool)

通过多次元可以模拟多重数组 a[i][j]

参数不能设定默认值和inout

● 可以添加标签

subscript(index i: Int)

● 可以重载

● 同构造体/类内部使用为self[参数]

   
   

Swift4 构造体, 属性, 索引的更多相关文章

  1. CLR via C#(11)-无参属性、有参数属性(索引器)

    一. 无参属性 1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断.属性的定义其实不复杂,先看个直观的例子: 说明: 属性要定义名称和类型,且类型不能是void. 属性是 ...

  2. ArcGIS Engine 创建索引(属性索引)——提高查询效率

    转自原文 ArcGIS Engine 创建索引(属性索引)——提高查询效率 众所周知,建立索引可以提高查询的效率,当对FeatureClass中的某一列频繁的查找,且数据量比较大时,建立索引是非常有必 ...

  3. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  4. IoC容器-Bean管理XML方式(创建对象和set注入属性,有参构造注入属性)

    Ioc操作Bean管理 1,什么是Bean管理 (0)Bean管理指的是两个操作 (1)Spring创建对象 (2)Spring注入属性 2,Bean管理操作有两种方式 (1)基于xml配置文件方式实 ...

  5. model类的构造部分属性的对象 产生的json

    在 action方法里, 产生一个对象,可能会是默认的全属性对象,那么在输出的 json就又所有 都出现了. 只是其他的属性全部是 null 那么 在 json里面配上 <!-- json 不产 ...

  6. go之构造体方法

    package main import ( "fmt" "math" ) type Vertexs struct { X, Y float64 } //Abs ...

  7. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  8. matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段

    一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...

  9. MongoDB的学习--索引类型和属性(转)

    原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...

随机推荐

  1. 【PD】PowerDesigner生成数据字典

    1.首先说明我使用的环境 --------------------------------第一种:不按模板导出导出数据字典----------------------------- 2.打开PDM模型 ...

  2. apache + DSO -动态共享对象(DSO)

    http://www.jinbuguo.com/apache/menu22/dso.html

  3. python学习之-- 面向对象

    面向对象(简写:OOP) 面向对象编程定义:利用类和对象来创建各种模型,来实现对真实世界的描述. 优点:使程序更容易理解和维护以及扩展代码. 类定义:用来描述具有相同的属性和方法的对象的集合.(简单讲 ...

  4. 系统性能不够原因可能是cpu不够,内存不够等等

    1.Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息. 通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 2. ...

  5. 手机没Root?你照样可以渗透路由器

    和Metasploit差不多,RouterSploit是一个强大的漏洞利用框架,用于快速识别和利用路由器中的普通漏洞,它还有个亮点,就是可以在绝大多数安卓设备上运行. 如果你想在电脑上运行,可以阅读这 ...

  6. 公布Java桌面程序

    我拿了一份桌面工具的开源码,修改动改,在elipse上执行.感觉良好.但到了公布应用程序,就傻眼了. 我竟然不知道咋公布! 呵呵,不愧是Java小白. 假设是微软阵营,直接就编译成exe了. 但jav ...

  7. Native进程之Trace原理(转)——可直接输出某进程的栈帧——debuggerd

    一. 概述 当发生ANR(Application Not Response,对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/dat ...

  8. OpenGL中视点模型坐标的理解

    个人的理解: gluLookAt中的eye.center和up的坐标原点是ModelView中的坐标原点,右手坐标系,Z轴正向指向显示器外侧 glOrtho中的near和far参数距离相对eye而言, ...

  9. bzoj3109【CQOI2013】新数独

    3109: [cqoi2013]新数独 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 365  Solved: 229 [Submit][Statu ...

  10. CSDN公开课:SCRUM敏捷开发(2015-8-19 免费)

    当前最火的敏捷可能就是SCRUM了.但敏捷无法落地.对人要求太高.老板对敏捷动机不良等问题怎样解决呢?我将在CSDN的公开课上为大家分享"SCRUM敏捷开发".各位朋友有杀错没放过 ...