1.基本语法:

/** 定义了一个结构体 */
struct Structure {
 
/// 一个常量存储式实例属性,
/// 并直接为它初始化
let constProperty =
 
/// 一个变量存储式实例属性
var property: Int
 
/// 初始化器
init() {
property =
}
 
/// 实例方法
func method() {
print("This is a structure")
}
}
 

2.存储式实例属性:

“在Swift中,结构体属于值类型,所以用一个对象对另一个对象进行初始化时,所采取的策略是属性复制,而不是引用机制。在此之后,我们可以看到test与test2两个对象就有各自的实例属性了。当test2的实例属性进行修改之后,test对象中的实例属性不会受任何影响。”

摘录来自: “大话Swift 4.0”。 iBooks. 

3.惰性存储式属性:

/// 定义一个函数,用于获取一个整数值
func fetchData() -> Int {
print("data fetched!")
return
}
 
struct Test {
 
/// 声明了一个惰性存储式实例属性prop,
/// 当它被第一次访问的时候才会调用fetchData函数对它初始化
lazy var prop = fetchData()
}

 4.计算式属性:

计算型属性只能用var,不能用let

/// 定义了一个Circle结构体,表示圆
struct Circle {
 
/// radius是一个Double类型的存储式实例属性
var radius = 0.0
 
/// 这里定义了用于表示直径的计算式实例属性
var diameter: Double {
 
// 定义它的getter方法。
// 这里要注意的是,
// getter方法的返回类型必须缺省!
// 其返回类型就是该计算式实例属性的类型
get {
return radius * 2.0
}
 
// 定义它的setter方法。
// 这里各位要注意的是,
// setter方法形参的类型必须缺省!
// 该形参类型就是该计算式属性的类型
set(value) {
radius = value / 2.0
}
}

set方法参数缺省,其隐式的形参标识符为newValue。

5.属性观察者:

/// 定义一个Test结构体
struct Test {
 
/// 这里声明了number存储式实例属性,
/// 其类型为Int,并且初始化为0
var number = {
 
// 这里定义了number的willSet属性观察者,
// 当number属性的值发生改变之前会调用此方法。
// 这里参数value是即将传给number的新值,
// 其类型与number相应。
willSet(value) {
print("current value = \(number)")
print("new value = \(value)")
}
 
// 这里定义了number的didSet属性观察者,
// 当number属性的值修改完之后就会调用此方法。
// 这里参数orgValue是指在修改number属性之前的值,
// 其类型与number相应。
didSet(orgValue) {
print("original value = \(orgValue)")
print("modified value = \(number)")
}
}
}

属性观察者中 willSet 方法以及 didSet 方法中的参数均可缺省。如果 willSet 方法的参数缺省,那么它对应的一个隐式参数标识符为 newValue。如果 didSet 方法中的参数缺省,那么它对应的一个隐式参数标识符为 oldValue。

一般来说,我们在属性观察者中 didSet 方法使用更多些,许多过滤操作都在此方法中进行。而 willSet 方法中则可记录一些数据统计,或对其他一些对象发送某些消息等。

6.类型属性:

枚举、结构体以及类类型都能定义属于自己的类型属性,而且声明方法非常简单,
只需要在属性声明最前面添加 static 关键字即可。类型属性与实例属性一样,
也具有存储式类型属性、计算式类型属性以及针对存储式类型属性的属性观察者。
由于类型属性本身具有惰性特质,所以我们不能用 lazy 去修饰它们。
此外,对于计算式类型属性,如果定义在一个类类型中,那么还可以使用 class 关键字去声明,
表示允许其子类覆盖当前类的实现。

7.实例方法:

8.类型方法:

直接在 func 前面添加 static 关键字即可。
如果当前类型是类类型,那么我们还能使用 class 关键字修饰,表示当前类型方法能被子类重写。
如果在类类型中用了 static 关键字去修饰类型方法,那么该类型方法就不允许被子类重写了。

9.初始化器方法:

struct Test {
var a =
let b: Float init() {
b = 1.0
}
}

10.逐成员的初始化器方法:

11.值类型的初始化器代理:

12.可失败的初始化器:

/// 定义一个结构体类型Test
struct Test {
 
/// 定义一个存储式实例属性a,
/// 它未被直接被初始化
var a: Int
 
/// 这里定义了一个可失败的初始化器方法。
/// 大家注意,这里的 init 与 ? 之间不允许出现任何空白字符。
init? (value: Int) {
if value == {
// 若形参value的值等于0,那么直接返回空
return nil
}
 
a = / value
 
// 在可失败的初始化器方法中只能使用 return nil 语句,
// 所以return后面不能添加其他对象或值
}
}
 
// 这里使用可失败的初始化器尝试创建一个对象实例。
// 这里test的类型为:Test?
let test = Test(value: )
 
if test == nil {
// 这里将会输出Failed!
print("Failed!")
}

13.下标语法:

Swift4.0复习结构体的更多相关文章

  1. C语言复习:结构体

    结构体专题 01.结构体类型定义及结构体变量定义     char c1,char c2, char name[62]; int age     char name[62]; int age,char ...

  2. Swift4.0复习特性、编译标志和检查API的可用性

    1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...

  3. Swift4.0复习访问控制与作用域

    1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...

  4. Swift4.0复习错误处理

    1.Swift中错误的表示: “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可.我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观 ...

  5. Swift4.0复习类型定义、类型投射等操作

    1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32   /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...

  6. Swift4.0复习类

    1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...

  7. Swift4.0复习协议

    1.协议的定义: /// 定义一个协议MyProt protocol MyProt {   /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo()   ...

  8. Swift4.0复习基本语法简介

    1.五种类型: 包含五种类型——枚举(enum).结构体(struct).类(class).协议( protocol)以及函数类型(function types). 2.变量对象:var 3.常量对象 ...

  9. ndk学习之C语言基础复习----结构体、共用体与C++开端

    自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...

随机推荐

  1. P3604 美好的每一天

    真·美好的每一天(美好个鬼啊) 真·调了一下午 原因是,我之前移动指针时没有先扩再缩,所以导致区间是负的:但是正常来说也没事,可是这题卡常,桶我开的是 unsigned short ,于是区间是负的, ...

  2. CSP-J总结&题解

    总结: 这一次,最后一次,还是不行啊. 文件操作方面:没有FCLOSE,血的教训. 考场复盘: 首先一二题没什么好讲的,秒切.但是第三题由于一开始看出来是完全背包,但是好像又不是,去年又有摆渡车阴影, ...

  3. Oracle trunc() 日期、数字截取函数

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...

  4. zabbix sender

    在zabbix中自定义一个虚拟主机,自定义key值,一般运用的是自动发现规则,给清单规则中配置上宏变量,通过py脚本调动zabbixsender模块,给这个主机,host发送一组包含键和宏变量的值,这 ...

  5. npm 删除指定的某个包以及再次安装

    npm uninstall xxxx --save-dev //删除包及删除配置项 npm install xxx@version //安装指定版本 npm install //覆盖

  6. P1108 低价购买——最长下降子序列+方案数

    P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ...

  7. LeetCode之找零钱

    题目:已知不同面值的钞票,求如 何用最少数量的钞票组成某个金额,求可 以使用的最少钞票数量.如果任意数量的已知面值钞票都无法组成该金额, 则返回-1. 示例: Input: coins = [1, 2 ...

  8. jquery 遍历对象、数组、集合

    <div id="result" style="font-size:16px;color:red;"></div><table c ...

  9. ubuntu之路——day2

    一:sougou输入法安装 详情参考:https://blog.csdn.net/xin17863935225/article/details/82285177 注意切换成fcitx架构 因为linu ...

  10. Acer笔记本如何装系统?

    一.准备工作 1.一个有win7或者XP系统的电脑(制作启动盘用) 2.一个8G以上的U盘 3.win7&win8系统包(win8.1下载地址:http://pan.baidu.com/s/1 ...