【iOS】Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

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

一、类与结构体

两者在Swift中差不了多少了

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

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

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

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

类比结构体多的功能:

1)能继承

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

3)析构释放资源

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

class Person1{
    var name = "jack"
}

struct Person2{
    var age:Int
}

//1.1实例化类与结构, 默认构造器
let p1 = Person1()
let p2 = Person2(age: 10)  //当使用默认构造器时, 必须初始化里面所有的属性

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

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

class Person3{
    var name:String = "xuneng"  //需要手动初始化
    var age:Int = 10
    let height = 175
    lazy var p1:Person1 = Person1() //延迟, 必须是var
}

var p3 = Person3()
p3.name   //通过点语法来访问
p3.age = 11   //设置

//延迟lazy存储属性: 当使用改属性时才进行初始化, 好处是避免空间浪费
println(p3.p1)   //这句调用时, p1才进行初始化

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

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

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

class Person4{
    var name:String = "jack"
    var jjLength:Int = 10
    var age:Int{  //只能是var
        get{
            return jjLength * 2
        }
        set(newAge){
            jjLength = newAge / 2
        }
    }
}
var p4 = Person4()
p4.age = 10   //当设age为10时,jjLength变为5

2.2.1 简便的计算属性写法

//默认参数newValue, 表示新赋给的值
class Person5{
    //用newValue
    var jjLength:Int = 10
    var age:Int{  //只能是var
        get{
            return jjLength * 2
        }
        set{
            jjLength = newValue / 2
        }
    }

    //只读计算属性
    var height:Int{
        get{
            return jjLength * 4
        }
    }

    var height2:Int{  //只读直接可以省略get
        return jjLength * 4
    }
}

var p5 = Person5()
p5.height
//p5.height = 10  //只读的不能赋值

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

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

计算属性不能直接赋值

class Person6{
    //用newValue
    var jjLength:Int = 10

//    var height2:Int = 10{  //不能直接赋值, 否则成存储属性了
//        return jjLength * 4
//    }

    var age:Int{
        get{
            return age   //死循环.  age会调用get方法
        }
        set{
           age = newValue    //死循环.  age设值时会调用set方法
        }
    }
}

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

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

class Person7{
    class var name:String{
        return "xuneng"
    }
}
Person7.name

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

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

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

willSet, didSet和set, get不能共存

class Person8{
    var name:String = "xuneng"{
        willSet{
            println("新值为:\(newValue)")    //newValue新值
        }
        didSet{
            println("新值为:\(oldValue)")   //oldValue表示旧值
        }
    }
}
var p8 = Person8()
p8.name = "jack"    //这句调用

三、函数与方法

3.1 对象方法

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

class Person9{
    func sum(num1:Int , num2:Int){
        println(num1 + num2)
    }
}
var p9 = Person9()
p9.sum(10, num2: 10)  //第一个参数以后, 全是外部参数. 相当于加了#

3.2 类方法. 用class修饰

class Person10{
    class func sum(num1:Int , num2:Int){
        println(num1 + num2)
    }
}
Person10.sum(10, num2: 10)

3.3 self与super, 与OC相同

class Person11{
    func sum(num1:Int , num2:Int){
        self.fun()   //对象方法调用对象方法, 类方法调用类方法
    }

    func fun(){
        println("hello")
    }
}

四、下标(附属脚本)

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

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

//格式:也可以设定set/get
/*
subscript(index:Int) -> Int{
    get{

    }
    set{

    }
}
*/
struct Person12{   //官方很多用的结构体
    let jjLength:Int      //结构体在这里可以不初始化

    subscript(index:Int) -> Int{
        return jjLength * index
    }
}

var p12 = Person12(jjLength: 10)
p12[3]     //直接像访问数组一样访问.  根据jj长度,index为3,值为30

参考:

The Swift Programming Language  

Apple Dev Center

转载请注明出处:http://blog.csdn.net/xn4545945  

时间: 2024-08-06 07:50:10

【iOS】Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等的相关文章

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

写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法) 3)都能使用扩展(extension)与协议(protocol) 4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中

Swift类与结构体

类和结构体有很多共性: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标访问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol),协议提供一种特定的标准 功能 类比结构体多出的功能: 能够继承另外一个类 能够核对运行期对象的类型 析构对象释放资源 引用计数允许一个类实例有多个引用 类和结构体的定义 定义类和结构体: [html] view plaincopy class SomeClass { // class definition goe

Swift-存储属性,计算属性,类属性

//类的属性定义 class Student: NSObject { // 定义属性 // 定义存储属性 var age : Int = 0 var name :String? var mathScore : Double = 0.0 var chineseScore :Double = 0.0 // 定义一个方法,可以是返回平均成绩 (注意: swift不建议这样使用,应该定义一个计算属性) func getAverageScore() -> Double { // 在swift如果是使用当前

swift——类和结构体对比

Swift 中类和结构体有很多共同点.共同处在于: ?       定义属性用于储存值 ?       定义方法用于提供功能 ?       定义下标用于通过下标语法访问值 ?       定义初始化器用于生成初始化值 ?       通过扩展以增加默认实现的功能 ?       符合协议以对某类提供标准功能 更多信息请参见属性,方法,下标,初始过程,扩展,和协议. 与结构体相比,类还有如下的附加功能: ?       继承允许一个类继承另一个类的特征 ?       类型转换允许在运行时检查和

swift类和结构体004-类和结构体基本使用

//: Playground - noun: a place where people can play import UIKit //----类和结构体------// //1.结构体的定义 struct Size { //结构体中的属性,给定默认值 var width = 375 var height = 667 //Swift的结构体中可以定义方法,与C.OC不同 func show() { print("(\(width):\(height))") } } var size =

swift 类 与 结构体

这两天突然有人问我  swift里面 类和 结构体  有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift  语言 虽然也已经出来很久了,但是总感觉还有许多东西 不如oc稳定.  每个 版本的 swift  都会有比较大的变动. 所以干脆先等等,等到工作不忙 swift也稳定了,然后再看也不迟. 但是 有些里面已经稳定了的东西可以先作为了解内容.  今天就说下类  和  结构体. http://c.bianche

swift 类和结构体

1:类和结构体定义 类和结构体分别通过关键字class 和struct定义. swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的.类的方法和属性则用小写字母开头的匈牙利表示法. 结构体总是通过被复制而进行代码传递的. struct SForm{ var iXX:Int = 99 var strHello:String = "dsf" func testFunc(iXX:Int)->Int{ return iXX+1 } } class

Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 (当没有实体时 使用pass代替) 下面定义一个鸟类; class flyBord: """鸟类""" pass #这里我们并没有实体所以我们使用pass代替 这就是一个类的最基本的定义 类中的__init__函数:类似于java中的构造函数,以及类

Swift类和结构体定义-备

Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { 定义结构体的成员 } 从语法格式上看,Swift中的类和结构体的定义更类似于Java语法,不需要像C++和Objective-C那样把接口部分和实现部分放到不同的文件中. 下面来看一个示例: class Employee {             //定义的类 var no: Int = 0 v