写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号。

一、类与结构体

两者在Swift中差不了多少了

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

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

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

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

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

类比结构体多的功能:

1)能继承

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

3)析构释放资源

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

  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中的成员变量

  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: 设, 用来封装设值的过程

  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 简便的计算属性写法

  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

计算属性不能直接赋值

  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. }

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

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

  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不能共存

  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 对象方法

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

  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修饰

  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相同

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

四、下标(附属脚本)

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

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

  1. //格式:也可以设定set/get
  2. /*
  3. subscript(index:Int) -> Int{
  4. get{
  5. }
  6. set{
  7. }
  8. }
  9. */
    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 类 与 结构体

    这两天突然有人问我  swift里面 类和 结构体  有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift  语言 ...

  2. swift中的结构体和枚举

    Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...

  3. Swift类和结构体

    在C++中,相信不会有太多人去详细考究结构体和类的区别,因为二者关系实在不大.但在Swift中,结构体和类的关系非常大,它们的组成部分都包括:初始化器.实例方法.实例属性.类型属性.类型方法等等:二者 ...

  4. Swift入门篇-结构体

    前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...

  5. swift 类和结构体

    1:类和结构体定义 类和结构体分别通过关键字class 和struct定义. swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的.类的方法和属性则用小写字 ...

  6. Swift类与结构体

    类和结构体有很多共性: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标访问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol),协议提供一种特 ...

  7. Swift: 类与结构体

    对比类与结构体 类与结构体有许多的相同点,它们都可以: 定义属性来存储值: 定义方法来提供功能: 定义下标操作: 定义初始化函数: 扩展它的默认的实现: 遵从协议: 类有一些额外的能力,但是结构体没有 ...

  8. Swift类和结构体定义-备

    Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...

  9. Swift基础(类,结构体,函数)

    import Foundation // 创建一个类 class Student { // 属性(类的属性必须赋初值,如果不赋值,需要写自定义方法) var studentName: String v ...

随机推荐

  1. Ubuntu下单网卡多IP地址的配置

    删除用户默认配置文件 由于在默认清空下,配置文件是系统自动生成的用户设备配置文件保存在/etc/udev/rule.d/下面:# cp /etc/udev/rule.d /etc/udev/rule. ...

  2. 解决Error: That port is already in use.

    ubuntu系统下,运行一个django项目,即输入python manage.py runserver后,可能出现 Error: That port is already in use.的错误. 即 ...

  3. ural1517后缀数组

    题意:求两串字符(0————255)的最长公共字串 思路:先将两个字符链接起来,中间用一个不曾出现过的字符,然后直接求出height数组,然后根据它的特性,求出最长的公共字串,当然这个最长公共字串的坐 ...

  4. C# 静态构造函数使用

    当我们想初始化一些静态变量的时候,就需要用到静态构造函数了.这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在创建第一个实例或引用任何静态成员之前,由.NET自动调用. 现 ...

  5. CSS(七):浮动

    一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...

  6. 扫描线 - UVALive - 6864 Strange Antennas

    Strange Antennas Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=87213 M ...

  7. css设置背景固定不滚动效果的示例

    css设置背景固定不滚动效果的示例 背景固定不滚动各位看到最多的无非就是QQ空间了,我们在很多的空间都可以看到内容滚动而北京图片不滚动了,下文整理了几个关于背景固定不滚动css代码. 一.css设置背 ...

  8. pycharm Tab键设置成4个空格

    file--->setting,选择Editor--->python,如下图所示:

  9. Ubuntu 16.04 更换阿里云源

    Ubuntu 16.04 更换阿里云源sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份sudo gedit /etc/apt/so ...

  10. VB.NET多线程入门

    近期项目中遇到了一个处理速度慢阻塞用户界面操作的问题,因此想用多线程来解决. 在处理数据的循环中,新建线程,在新建的线程中处理数据.多线程同一时候处理数据,以此来达到加速的目的,使用户界面操作变得流畅 ...