Swift4 构造体, 属性, 索引

创建: 2018/02/19

完成: 2018/02/25

 

【任务表】TODO

 

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

 ● 构造体是值型 

 

 构造体的初始值

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

型名()

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

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

 

 全项目构造函数

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

型名(所有属性参数)

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

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

 

 代入常数的结构体

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

 值型

 构造体的常数属性

 初始化后不能改变值

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

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

 自定义构造函数 
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[参数]

 

  
  

转载于:https://www.cnblogs.com/lancgg/p/8454548.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值