一、类与结构体

两者在Swift中差不了多少了

类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的)

1)都可以定义属性/方法/下标(结构体也可以定义方法了)

2)都能初始化(通过构造方法)

3)都能使用扩展(extension)与协议(protocol)

4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static

类比结构体多的功能:

1)能继承

2)运行时能检查类对象的类型

3)析构释放资源

4)引用计数允许一个类实例有多个引用

[java] view plaincopy
  1. class Person1{
  2. var name = "jack"
  3. //    class var height:Int = 10   //错误! 类中不能有全局存储属性的, 只能是计算属性. 见下文说明
  4. }
  5. struct Person2{   //结构体更像Java中的类
  6. var age:Int
  7. //    static var height:Int = 10  //可以设定全局属性, 需要初始化.
  8. }
  9. //1.1实例化类与结构, 默认构造器
  10. let p1 = Person1()
  11. let p2 = Person2(age: 10)  //当使用默认构造器时, 必须初始化里面所有的属性

二、属性(存储属性--计算属性--类属性)

2.1存储属性: 就是存储一个常量或变量,类似Java中的成员变量

[java] view plaincopy
  1. class Person3{
  2. var name:String = "xuneng"  //需要手动初始化
  3. var age:Int = 10
  4. let height = 175
  5. lazy var p1:Person1 = Person1() //延迟, 必须是var
  6. }
  7. var p3 = Person3()
  8. p3.name   //通过点语法来访问
  9. p3.age = 11   //设置
  10. //延迟lazy存储属性: 当使用改属性时才进行初始化, 好处是避免空间浪费
  11. println(p3.p1)   //这句调用时, p1才进行初始化

2.2计算属性: 不直接存储值,而是用get/set来做.可用来操作其他属性值的变化

get: 取, 用来封装取值的过程

set: 设, 用来封装设值的过程

[java] view plaincopy
  1. class Person4{
  2. var name:String = "jack"
  3. var jjLength:Int = 10
  4. var age:Int{  //只能是var
  5. get{
  6. return jjLength * 2
  7. }
  8. set(newAge){
  9. jjLength = newAge / 2
  10. }
  11. }
  12. }
  13. var p4 = Person4()
  14. p4.age = 10   //当设age为10时,jjLength变为5

2.2.1 简便的计算属性写法

[java] view plaincopy
  1. //默认参数newValue, 表示新赋给的值
  2. class Person5{
  3. //用newValue
  4. var jjLength:Int = 10
  5. var age:Int{  //只能是var
  6. get{
  7. return jjLength * 2
  8. }
  9. set{
  10. jjLength = newValue / 2
  11. }
  12. }
  13. //只读计算属性
  14. var height:Int{
  15. get{
  16. return jjLength * 4
  17. }
  18. }
  19. var height2:Int{  //只读直接可以省略get
  20. return jjLength * 4
  21. }
  22. }
  23. var p5 = Person5()
  24. p5.height
  25. //p5.height = 10  //只读的不能赋值

2.2.2 注意计算属性的死循环情况

计算属性的值是不固定的,因此不能用let修饰,只能用var

计算属性不能直接赋值

set  和get 是针对 计算变量(Calculated property ) 是不可以赋值的     普通的存储变量(storage property)才是可以赋值的

对属性赋值进行监视最好就是用willSet{ }

[java] view plaincopy
  1. class Person6{
  2. //用newValue
  3. var jjLength:Int = 10
  4. //    var height2:Int = 10{  //不能直接赋值, 否则成存储属性了
  5. //        return jjLength * 4
  6. //    }
  7. var age:Int{
  8. get{
  9. return age   //死循环.  age会调用get方法
  10. }
  11. set{
  12. age = newValue    //死循环.  age设值时会调用set方法
  13. }
  14. }
  15. }

只读计算属性

只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。

注意:必须使用var关键字定义计算属性,包括只读计算属性,因为他们的值不是固定的。let关键字只用来声明常量属性,表示初始化后再也无法修改的值。

只读计算属性的声明可以去掉get关键字和花括号:

  1. struct Cuboid {
  2. var width = 0.0, height = 0.0, depth = 0.0
  3. var volume: Double {
  4. return width * height * depth
  5. }
  6. }
  7. let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
  8. println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
  9. // 输出 "the volume of fourByFiveByTwo is 40.0"

这个例子定义了一个名为Cuboid的结构体,表示三维空间的立方体,包含width、height和depth属性,还有一个名为volume的只读计算属性用来返回立方体的体积。设置volume的值毫无意义,因为通过width、height和depth就能算出volume。然而,Cuboid提供一个只读计算属性来让外部用户直接获取体积是很有用的。

2.3 类属性(或者叫做类型属性)用class关键字修饰.类属性只能是计算属性.

类属性就是类似java中static修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用

[java] view plaincopy
  1. class Person7{
  2. class var name:String{
  3. return "xuneng"
  4. }
  5. }
  6. Person7.name

2.4 属性监视器: 可用来监视属性变化的2个方法willSet, didSet

计算属性因为有get和set方法,因此监视器其实对计算属性没多大用处.对存储属性用处大

初始化值时, 不会调用willSet与didSet

willSet, didSet和set, get不能共存

[java] view plaincopy
  1. class Person8{
  2. var name:String = "xuneng"{
  3. willSet{
  4. println("新值为:\(newValue)")    //newValue新值
  5. }
  6. didSet{
  7. println("新值为:\(oldValue)")   //oldValue表示旧值
  8. }
  9. }
  10. }
  11. var p8 = Person8()
  12. p8.name = "jack"    //这句调用

三、函数与方法

3.1 对象方法

类中的方法与函数的一点区别: 方法的第一个参数以后,全是外部参数.名字即为参数名

[java] view plaincopy
  1. class Person9{
  2. func sum(num1:Int , num2:Int){
  3. println(num1 + num2)
  4. }
  5. }
  6. var p9 = Person9()
  7. p9.sum(10, num2: 10)  //第一个参数以后, 全是外部参数. 相当于加了#

3.2 类方法. 用class修饰

[java] view plaincopy
  1. class Person10{
  2. class func sum(num1:Int , num2:Int){
  3. println(num1 + num2)
  4. }
  5. }
  6. Person10.sum(10, num2: 10)

3.3 self与super, 与OC相同

[java] view plaincopy
  1. class Person11{
  2. func sum(num1:Int , num2:Int){
  3. self.fun()   //对象方法调用对象方法, 类方法调用类方法
  4. }
  5. func fun(){
  6. println("hello")
  7. }
  8. }

四、下标(附属脚本)

下标, 有的叫附属脚本(subscript), 新东西。

可以定义在 类/结构体/枚举中,进行快速访问。

[java] view plaincopy
  1. //格式:也可以设定set/get
  2. /*
  3. subscript(index:Int) -> Int{
  4. get{
  5. }
  6. set{
  7. }
  8. }
  9. */
[java] view plaincopy
  1. struct Person12{   //官方很多用的结构体
  2. let jjLength:Int      //结构体在这里可以不初始化
  3. subscript(index:Int) -> Int{
  4. return jjLength * index
  5. }
  6. }
  7. var p12 = Person12(jjLength: 10)
  8. p12[3]     //直接像访问数组一样访问.  根据jj长度,index为3,值为30

Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等相关推荐

  1. Swift 类与结构体

    前言 类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swif ...

  2. Swift 类和结构体总结

    Swift 类和结构体总结 类和结构体都是多功能而且灵活的结构,它们可以作为构建块(building block)在代码中使用.你可以为类和结构体定义属性和方法来扩充它们的功能.对于自定义类,Swif ...

  3. Swift —— 类与结构体

    Swift -- 类与结构体 1. 初识类与结构体 1.1 异同点 1.2 类(引用类型) 1.3 结构体 (值类型) 1.4 类和结构体的内存位置 1.4.1 结构体的内存位置 1.4.2 类的内存 ...

  4. swift类和结构体

    2.9类和结构体 本页包含内容: 类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 字符串.数组.和字典类型的赋值与复制行为 类和结构体是人们构建代码所用的一种通用且灵活的构造体. ...

  5. p怎么调用python的实例属性_Python中类的声明,使用,属性,实例属性,计算属性及继承,重写...

    Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下:classclassName:"类的注释"类的实体 (当没有 ...

  6. Vue02基础语法-插值+过滤器+计算属性+计算属性

    14天阅读挑战赛 努力是为了不平庸~ 目录 1.模板语法 1.1 插值 1.1.1 文本 1.1.2 html 1.1.3 属性 1.1.4 表达式 1.2 指令:指令指的是带有"v-&qu ...

  7. 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积,在main方法中创建长方形类对象,并调用计算长方形面积的方法。

    package TestDemo; /** 创建一个长方形类,成员域有长方形的长和宽,成员方法有计算长方形的面积.* 在main方法中创建长方形类对象,并调用计算长方形面积的方法.*/ import ...

  8. Swift 类和结构体

    Swift 中结构体和类的功能更加相近 结构体和类对比 Swift 中结构体和类有很多共同点.两者都可以: 定义属性用于存储值 定义方法用于提供功能 定义下标操作用于通过下标语法访问它们的值 定义构造 ...

  9. Vue 模板语法 插值操作 绑定属性 计算属性 事件监听 条件判断 循环遍历 阶段案例

    1 插值操作 1.1 Mustache语法 也就是双大括号 {{ }} <div id="app"> <!-- mustche语法中,不仅可以直接写变量,也可以写 ...

最新文章

  1. Paired Joint Coordinates
  2. php ajax实现编辑资料,怎么用jQuery、Ajax、php实现这样的无刷新编辑功能?
  3. 监控和剖析数据库操作P6Spy,SQL Profiler,SQL 使用简介
  4. Tensorflow Python API 翻译(sparse_ops)
  5. linux mysql 确认命令_LINUX启动/重启/停上MYSQL的命令(详解)
  6. 《Ray Tracing in One Weekend》——Chapter 5: Surface normals and multiple objects
  7. asp.net core 系列之用户认证(authentication)
  8. Silverlight常见问题解决方法
  9. c语言大学题库pdf,C语言试题库(完整版)..pdf
  10. 杭州电子科技大学java刷题_杭州电子科技大学的OJ
  11. 有向图和有权图的邻接矩阵表示法
  12. mysql一个字段为空时使用另一个字段排序
  13. Linux、Xshell
  14. 如何用天干地支计算年月日时?
  15. datax 导入数据中文乱码_四种方法处理MYSQL导入中文数据时的乱码问题 | 很文博客...
  16. emoji-mart或者emoji-picker-react实现一个类似于微信聊天的在线发送表情,再加一个带源码的纯js实现,emoji图片本地加载
  17. python 大众 同城
  18. U-Net论文阅读笔记
  19. 数据结构笔记——自用
  20. 幼儿园管理系统测试报告

热门文章

  1. NBT:设计稳定无毒的抗菌肽杀灭耐药菌
  2. 喜报!清华社《晓肚知肠:肠菌的小心思》荣获“2018年度中国好书”奖
  3. EggNOG功能注释数据库在线和本地使用
  4. 培养组学对已分离人类细菌和古菌物种库的贡献
  5. Nature综述:微生物构成的氮循环网络
  6. 2017年8月Science肠道菌群研究
  7. python使用matplotlib绘制一条正弦曲线(plot函数可视化sine plot)
  8. R语言使用table函数计算单分类变量的频率表(frequency table)、使用prop.table函数将table函数计算获得的频率表转化为比率表、返回单分类变量每一个类别的比率、或者百分比
  9. R语言基于随机森林进行特征选择(feature selection)
  10. R语言layout函数处理可视化图像布局实战